2016-10-23 10 views
-1

Ожидаемый результат из следующего кода должен быть 505,5, но вместо этого он возвращает 3,97541e + 70. Почему это так и как решить проблему?Почему этот код не возвращает переменную bpEffect со значением 505,5?

#include <iostream> 
#include <string> 
using namespace std; 
class Position { 
public: 
    Position(int s, double p, string n) { 
     shares = s; 
     price = p; 
     name = n; 
    } 
    double getBpEffect() { 
     return bpEffect; 
    } 
private: 
    string name; 
    int shares; 
    double price; 
    double bpEffect = (shares*price)/2; 

}; 


int main() { 
    Position xyz = Position(100, 10.11, "xyz"); 
    double buyingPower = xyz.getBpEffect(); 


    cout << buyingPower; 

    system("pause"); 
    return 0; 

} 
+2

'(акций * цена)/2' бывает слишком рано, до' 'shares' и price' инициализируются , Вы делаете арифметику на случайном мусоре, поэтому, конечно, вы получаете мусор. Инициализируйте 'bpEffect' после того, как вы присвоили значения' shares' и 'price'. –

+0

Игорь прав. Вы должны помещать '(share * price)/2' в метод, такой как ваш конструктор, а не как инициализирующий оператор в вашем коде. – Nonanon

+0

, как сказал Игорь Тандетник, вы управляете мусором; мусор в мусор; Решение очевидно: 'Position (int s, double p, string n): name {n}, shares {s}, price {p}, bpEffect {(share * price)/2} {}' – max66

ответ

2

double bpEffect = (shares*price)/2; запускается перед тем тело вашего конструктора используя неопределенные значения в shares и price. Вы должны вычислить bpEffect после того, как вы инициализировали другие переменные.

0

Показанный класс инициализируется смесью кода конструктора и явной инициализацией члена.

Если порядок, в котором происходят различные кусочки конструкции класса, полностью понятен, довольно легко добиться того, чтобы все произошло в неправильном порядке.

Самое лучшее, что нужно сделать, это инициализировать все в одном месте, удаляя все двусмысленности:

Position(int s, double p, string n) 
    : name(n), shares(s), price(p), 
    bpEffect((shares*price)/2) 
{ 
}