2016-05-19 6 views
0

私は最近、私が最近書いたかなり複雑なプログラムを再設計しています。プログラムは、お互いに依存するさまざまなオブジェクトで構成されています。私が今実現しようとしているのは、オブジェクトの1つを変更して同じタイプのオブジェクトで置き換える(異なるオブジェクトの作成中に割り当てられる)さまざまなプロパティに置き換える機能です。スマートポインタオブジェクトを変更して後でアクセスする

この機能を実装する適切な方法は何でしょうか?

私はこれまで何をしましたか?

現在、私は、異なるオブジェクトを含むunique_ptrのセットを含む単一の「マスタークラス」を使用しています。 object1がobject2に依存しているとしましょう。したがって、構築中にobject2の入ったスマートポインタをobject1のコンストラクタへの参照によって渡します。
私は建設後object2はの機能にアクセスできるようにしたいと、私は何とか後で使用するためにそれを参照する必要があります。それは、特定のメモリを指すように、私は基礎となるオブジェクトに生のポインタを使用することはできません私の理解から

古いオブジェクトが置き換えられたときに変更される可能性のあるアドレス。 現在、私はスマートポインタ自体を参照する参照を使用しようとしています。スマートポインタ自体のアドレスは決して変更するべきではありませんが、object2がどこにあるかを常に意識してください。

これはオプションですか?今は、object2の中の特定の変数へのポインタを使用していた問題に取り組んでいるので(同じコードの書き込みと読み込みを中心に)、同じアドレス問題に再び遭遇することは間違いありません。この場合、最初の参照内の変数への参照を使用する必要がありますか?これは機能しますか?

スマートポインタを参照するローポインタを使用することもできますが、これは正しい方法ではないように感じます。私はC++を使い始めたばかりでなく、ポインタを過度に使用しているように感じたり、スマートポインタを正しく使用していない可能性があります。私は分かりません。あなたがする必要がどのような

+0

これは、あなたが望むものによって異なります:現在、他のどのオブジェクトがそれに依存しているかに関係なく、「the object2」を変更しますか?次に共有ポインタのプールが考えられ、依存関係は共有ポインタデータメンバーとして表現されます。または、 "object1の現在のオブジェクト2"を変更しますか?次に、object1にはobject2への一意のポインターが含まれ、accessor関数を介してobject2が公開されます。 –

答えて

1

は、あなたのMasterClassのみMasterClassは、サブオブジェクトのすべてのインスタンスを所有しているように(そうなしshared_ptr)その所有権が一意であると仮定すると、そのconstリットル値の参照によってunique_ptrを使用して、周りにそれらを渡すことです特定のサブオブジェクトの正しいアドレスに常にアクセスできるようになります(unique_ptrはラッパーとしても機能します)。

私は何を意味しているようなもの:あなたがMasterClassないクラスから管理対象オブジェクトを変更する必要がある場合は、非const参照を使用することができますが、これはstd::unique_ptr以来、いくつかの問題を公開し

class Object2 { 
    const std::unique_ptr<Object1>& object1; 
public: 
    Object2(const std::unique_ptr<Object1>& object1) : object1(object1) { } 
} 

class MasterClass { 
    std::unique_ptr<Object1> object1; 
    std::unique_ptr<Object2> object2; 

    MasterClass() : object1(new Object1()), object2(new Object2(object1)) { } 

    void replace() { 
    // no problem for Object2 
    object1.reset(new Object1()); 
    } 
} 

マインド非constリファレンスを渡しても、呼び出された関数が独自のunique_ptrまたはそのような微妙なものに移動することによって所有権を取得しないことは、本当に保証されません。

+0

これは基本的に私が今やっていることです。これが適切な方法であると聞いてうれしく思います。参照が割り当てられた後に参照のターゲットを変更できないため、constが必要なことはわかりませんでしたが、そのことを念頭に置いておきます! – boaschtel

+0

ターゲットを変更することはできませんが、非constメソッドを呼び出すことはできます – Jack

関連する問題