2016-12-18 2 views
-4

を割り当てています。ベースオブジェクトにオブジェクトを追加しようとしていますが、コンパイルできますが、addbase関数内でクラッシュする可能性があります。 pointerclass(){base *basees=new base[5];}オブジェクトの配列にオブジェクトを割り当てます。このコードでは、オブジェクトにC++

class base 
{ 
    string a; 
    public: 
    void setstring(string); 
    string showstring(){ return a; } 
}; 

void base::setstring(string ss) 
{ 
    a=ss; 
} 

class pointerclass 
{ 
    public: 
    base *basees; 
    pointerclass() {base *basees=new base[5]; } 
    void addbase(base,int); 
}; 

void pointerclass::addbase(base ab,int i) 
{ 
    //will crash here 
    basees[i] = ab; 
} 

int main() 
{ 
    base a,b,c; 
    a.setstring("something"); 
    pointerclass aaa; 
    aaa.addbase(a,0); 
    cout<<aaa.basees[0].showstring(); 
    return 0; 
}  
+2

適切なツールのためのメモリを割り当てる必要がありますが、あなたのデバッガです:あなたは、コンストラクタ内行うには何を意味するのか

は次のとおりです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

前のコメントは "あなたの質問を編集するべきです" - 拡張で明白に何かが間違っていたことをご指摘ください。 –

答えて

1

pointerclassのコンストラクタであなたは次のようにします。

base *basees=new base[5]; 

これは、コンストラクタ内baseesと呼ばれる新しいローカル変数を宣言し、それがあることを忘れて、コンストラクタから復帰するそれのためにメモリを割り当て、ローカル変数は存在していた。

この結果、pointerclassというメンバフィールドはbaseesという名前には決して初期化されません。

最初に何かをpointerclass.baseesに割り当てようとすると、プログラムが爆発します。

basees=new base[5]; 
+1

以上、 'pointerclass():basees(new base [5]){}' –

+1

あなたのコンパイラはおそらくこの未使用の変数について警告しました。 –

0

はあなたがメンバーbaseesが、唯一の括弧の中に住ん変数baseesない割り当てる)は良いが、私はそれがここに私のコードの動作には影響しませんだと思います。

0

あなたは、このような問題を解決するためにメンバーポインタbasess

関連する問題