-1

私の意図はクラスAにBオブジェクトのリストを格納することですが、Bコンストラクターを呼び出すときにAリストに新しい要素を作成したいと思います。

私はこのようなコードを持っています:

class A
{...
    protected:
      std::list<B> Blist;
      std::list<B>::iterator Bit;
 ...
    public:
      Update();
 ...
    friend class B;
}


class B
{...
    protected:
       A* p_A;
 ...
    public:
       B(); //Standard constructor
       B(A* pa); // This is the constructor I normally use
}


B::B(A* pa)
{
    p_A=pa; // p_A Initialization

    p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), *this);
}

A::Update()
{

   for(Bit=Blist.begin(); Bit != Blist.end(); Bit++)
   {
     (*Bit).Draw() //Unrelated code
   }

}

void main() //For the sake of clarity
{

    A* Aclass = new A;
    B* Bclass = new B(A);

    Aclass.Update(); // Here is where something goes wrong; current elements on the list are zeroed and data missed

}

プログラムは問題なくコンパイルされますが、プログラムを実行すると、目的の結果が得られません。

BIの場合、2つのコンストラクターがあります。デフォルトのコンストラクターはすべてをゼロにし、もう1つは入力を受け入れて内部変数を初期化します。

2番目を使用してプライベート変数を初期化すると、A.Updateメソッド中にすべてがゼロになり、代わりにデフォルトのコンストラクターを使用したように見えます。

私は何か間違ったことをしていますか?私のアプローチは正しいですか?

ありがとうございます!

編集:明確にするために編集されたプログラム

4

3 に答える 3

2

逆参照する前に、p_Aの初期化を試してみることをお勧めします。

于 2012-09-06T22:49:11.247 に答える
1
std::list<B> Blist;

これは タイプBlistオブジェクトinsert(iterator,value)です。の場合、リストにコピーする値を指定します。Bこれにより、コピーコンストラクターによって作成されたリストによって保持される新しいオブジェクトが生成されます。Bのコピーコンストラクタが必要な初期化手順を実行しない場合、オブジェクトは期待した状態になりません。

std::list<B*> Blist;

オブジェクトの代わりにポインタのリストを保持すると、リストに存在する新しいオブジェクトを作成するのではなく、オブジェクトがすでに作成されたアイテムにアクセスできるようになります。ABB

于 2012-09-07T00:15:49.890 に答える
0

変化:

std::list<B> Blist;
std::list<B>::iterator Bit;

std::list<B*> Blist;
std::list<B*>::iterator Bit;

p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), *this);

p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), this);

あなたの問題を解決する必要があります。

于 2012-09-07T09:57:43.320 に答える