-3

まず、いくつかのコードを示したいと思います。おそらく役立つでしょう。

CBank *Bank;

COkno Okno(Bank);
CBohater Bohater(Bank);
CKlawiatura Klawiatura(Bank);
CWszystkiePlatformy WszystkiePlatformy(Bank);
Bank = new CBank(&Okno, &Bohater, &Klawiatura, &WszystkiePlatformy);

主なアイデアは、それらをグループ化するCBankを除いて上記のすべてのクラスを配置し、グループ化されたクラスが互いにアクセスできるようにすることです。正しい方法でやっているかどうかはわかりません。クラス COkno ... などでポインターの上のコードを試してみると、時代遅れで正しいデータが保存されません。

4

2 に答える 2

3

自動保存期間を持つオブジェクトへのポインターを保存しています(少なくとも、例が投稿されている方法からはわかりにくいかもしれません)。それらが現在のスコープ ポインターを離れると、それらへのポインターは無効になります。

次に、オブジェクトへBankのポインタであるをそれぞれに渡しますが、初期化する前に渡します。CBankコピーが作成され、Bank後で初期化されるときに新しい値に設定されますが、他のオブジェクトには無効なポインターのコピーが残っています。悪いアイデア。

ここには奇妙な依存関係があります。これら 3 つのコンストラクターに渡すにはポインターが必要ですがCBank、同時にこれら 3 つのオブジェクトをCBankコンストラクターに渡す必要があります。依存関係は循環的であり、これは不適切な設計です。

できることはCBank、これらのオブジェクトを内部的に構築するように変更することです。動的メモリ割り当てが必要ない場合...まあ、使用しないでください。必要な場合は、 のコンストラクタ内またはコンストラクタnew内のオブジェクトを起動し、デストラクタでそれらの割り当てを解除します (これを行う場合は 、3 の規則に従うことを忘れないでください!)。CBankCBank

自問してみてください; これらの依存関係は本当に必要ですか? この関係を単純化できますか?

于 2012-06-11T18:16:07.667 に答える
1

簡略化されたバージョンは、相互に参照しようとする 2 つのオブジェクトを持つことです。

class A {
    A(A* other);
};

A* one = new A(two); // ?
A* two = new A(one);

(ここには 1 つのクラスがありますが、異なるクラスがあります。これは実際には問題ではありません)。

が作成される前にone参照できないため、これは明らかに機能しません。twotwo

残念ながら、2 フェーズの初期化以外にこれを行う合理的な方法はありません。オブジェクトは何らかの方法で作成する必要があり、そのうちの 1 つは 2 番目のオブジェクトがまだ存在しないことを認識する必要があります。

したがって、次のようなものです:

class A {
    A(A* other);
    A();
    // ...
};

A* one = new A();
B* two = new A(one);
one->setOtherReference(two);

はい、これは 2 段階の初期化を意味します。つまり、oneが作成されたがまだ完全に初期化されていない (setOtherReference()機能するために必要なのを待っている) 時間があります。

ところで: これを避けるために、デザインを単純化することができる可能性があります!

于 2012-06-11T18:20:17.767 に答える