2016-10-23 6 views
-1

次のコードの予想結果は505.5である必要がありますが、代わりに3.97541e + 70が返されます。なぜこれが当てはまり、どのように問題を解決できるのでしょうか?なぜこのコードは値505.5のbpEffect変数を返しませんか?

#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'前に、早期にあまりにも起こります。あなたは無作為なゴミに対して算術演算をしているので、もちろんガーベジを得ることができます。 'shares'と' price'に値を割り当てた後、 'bpEffect'を初期化します。 –

+0

イゴールは正しいです。 '(shares * price)/ 2'をあなたのコンストラクタのようなメソッドに入れて、あなたのコードの初期文としてではなくてはなりません。 – Nonanon

+0

がIgor Tandetnikによると、あなたはゴミを管理しています。間違いのゴミを出すゴミ。解決策は明白である:「位置(int s、double p、string n):名前{n}、株式{s}、価格{p}、bpEffect {(shares * price)/ 2} {} ' – max66

答えて

2

double bpEffect = (shares*price)/2;sharespriceで未定義の値を使用して、コンストラクタの前に身体を実行しています。他の変数を初期化した後にbpEffectを計算する必要があります。

0

示されたクラスは、コンストラクタコードと明示的なメンバの初期化の混合によって初期化されます。

さまざまなビット構成やクラス構成の順序が完全に理解されていない限り、間違った順序で起こることは非常に簡単です。

行うための最善のことは、すべての曖昧さを取り除く、一つの場所ですべてを初期化することである。

Position(int s, double p, string n) 
    : name(n), shares(s), price(p), 
    bpEffect((shares*price)/2) 
{ 
} 
関連する問題