0

宿題があり、行き詰まっています...コードは次のようになります。

class X {  
...  
};  

class Y {  
public:   
Y(X*);  
...  
};

int main () {  
X* px = new X;  
new Y(px);  
!@##   
}

タスク:

new Y(px) で作成されたクラス Y の動的オブジェクトは、!@## でマークされた場所で失われず、削除できます。それはどのように可能ですか?オブジェクトを削除する、クラス X および Y の追加コードを記述します。

4

4 に答える 4

2

私の頭に浮かぶ1つの解決策は次のとおりです。

  • に 1 つのポインターを追加Yします。class X
  • のコンストラクターでY、 が指すオブジェクトを変更しX*て、新しく作成されたYオブジェクトへのポインターを持つようにします。
  • freeのデストラクタで、作成されたオブジェクトXのアドレスを格納するポインタが指すメモリY

@EdHeal のコメントのため、編集します。潜在的な問題があります。この「メソッド」を使用すると、同じYオブジェクトを複数回削除しようとする場合があります (複数のオブジェクトに渡されたX場合)。

これは事実ですが、まれなケースです。
ポインタX::Y*がプライベートであり、ゲッターがないX場合 (つまり、このオブジェクトの唯一の所有者である場合Y)、そのような可能性はありません。

new を double+ で削除するにはY、あるオブジェクトの へのポインタを別のオブジェクトに渡す必要があります。つまり、次のようなものです。XYX

X* px = new X;  
new Y(px); 
X* another_px = new X;
another_px->Y_pointer = px->Y_pointer; // or using some accessors
于 2012-08-10T11:28:47.473 に答える
1

Y(px)が実行されたときに何が起こっているかを考えてみてください。何と呼ばれていますか?どのように使用できますか?

于 2012-08-10T11:27:46.473 に答える
0

new Y戻り値を適切なポインター変数に保存しないため、失われます。

失いたくない場合は、次のように書き換えます。

Y* py = new Y(px);

// ...

delete py;
于 2012-08-10T11:26:33.743 に答える
0

new 演算子 ( ) からのポインターを保持する必要がありますnew Y(px);

すなわち

py = new Y(px);

次に、delete onpxpy

通常、それを作成したものはそれを削除するのが適切なポリシーです。

于 2012-08-10T11:29:26.033 に答える