私はC++でポインタの問題を解決しようとするといくつかの困難を抱えています。共有ポインターで一意のポインターを指すようにしても構いませんか?
私はMyClass
と呼ばれるクラスを持っているとしましょう。このクラスの内部には、MyResource
という外部リソースを指す共有ポインタがあります。 MyClass
の中に、MyObject
というオブジェクトのインスタンスがいくつかあるとしましょう。 MyObject
の各インスタンスもMyResource
を参照する必要があります。のは、このクラスは、私はちょうど私が以前に(しようとした)していた方法
class MyClass
{
shared_ptr<MyResource> m_p_my_resource;
MyObject m_my_object1;
MyObject m_my_object2;
MyObject m_my_object3;
}
を述べてきたこれらのコンポーネントが含まれている以外何もしないと仮定しましょう、私は共有のポインタを作成し、m_p_my_resource
にそれを与えるだろう、これを実装しました。私はMyObject
の各インスタンスにm_p_my_resource
を与えます。 m_p_my_resource
が新しいMyResource
を指すように変更されたときはいつでも、MyObject
のそれぞれが新しいリソースを指していると思いました。
しかし、私が行ったことは正しいとは思いません。 m_p_my_resource
を変更すると、これは実際には新しいリソースを指しているはずです。しかし、MyObject
の各インスタンスは、依然として元のMyResource
を指しています。
今私が元々しようとしていたことを実際に実装する方法について考えてみよう:m_p_my_resource
を変更できるようにし、各インスタンスも新しいリソースを指すようにする。
これを解決する1つの方法は、m_p_my_resource
が変更されるたびにMyObject
の各インスタンスを更新することです。私はおそらくメソッドを持って、m_p_my_resource
を更新してからMyObject
の各インスタンスを反復処理する必要があります。
代わりの解決方法は、の各インスタンスにポインタMyResource
のポインタを含めることです。したがって、各MyObject
がリソース自体の代わりにリソースへのポインタを指していた場合、私はm_p_my_resource
を変更することができ、各オブジェクトは新しいリソースを決定することもできます。
この2番目の方法はおそらく上記のクラスの例では機能しますが、クラス内に含まれていないMyObject
のインスタンスに対してはエレガントではありません。私が単純にスタックにMyObject
を作成した場合、リソースを指している中間のポインタを指すのではなく、直接リソースを指すようにします。
私が記述したものを実装するための最良の方法を決定する。私はスマートなポインタにはまだ比較的新しいですし、私がやろうとしていることがばかばかしい場合、あるいはより良い/明白な代替ソリューションがあれば、興味があります。
最初のソリューションは、それを行うための適切なオブジェクト指向の方法です。適切なカプセル化を保証し、(MyResourceが不変であると仮定して)すべてのデータ構造を非偶発的に保ちます。 – sbabbi