0

オブジェクトはすべて同じタイプであり、すべてのオブジェクトに対して同じ初期化コードを繰り返したくないため、多数の大きなオブジェクトの作成と初期化を担当するクラスがあります。それぞれに対して Init メソッドを呼び出しますたとえば、次のようになります。

InitObject(objMember);

void Test::InitObject(LargeObject * obj)
{
    obj = new LargeObject;
    obj->Load();
    obj->SetSomeProperty(false);
}

これが完了したら、パブリック メソッドから一連のメソッドを呼び出して、各オブジェクトへのポインターを取得します。

//public
LargeObject * Test::GetObject()
{
    return objMember;
}

問題は、オブジェクトのスコープが失われていることです。InitObject が呼び出されると、オブジェクトは正しく構築されて入力されますが、GetObject を呼び出すと、すべてが失われます。

些細なことを見落としているのかもしれませんが、なぜ範囲外になるのかわかりません。

4

1 に答える 1

2

些細なことです、はい。元のポインターのコピーを初期化しています。あなたはおそらく参照渡ししたいと思うでしょう:

void Test::InitObject(LargeObject*& obj)

値渡しとnewは、ポインターのコピーに戻り値を代入していることを意味します。関数の外のものInitObjectは変更されません。

さらにいくつかのこと - 構築後のオブジェクトの初期化は注意して行う必要があります。オブジェクトが構築後に有効でない場合、それは悪い設計です (一部のまれなケースを除く)。コンストラクターから例外をスローすることにより、無効な初期化を通知できます。

また、未加工のポインターの代わりにスマート ポインターを使用することを検討してください。

于 2012-10-14T16:55:16.700 に答える