この回答を見ると、私のプログラムで行ったように、C++ で友情を使用してプライベート ポインターをコピーしないでください。
class bar;
class foo
{
private:
some_smart_pointer<int> state;
public:
foo(int value) : state(new int(value)) {}
friend class baz;
};
class bar
{
private:
some_weak_pointer<int> state;
public:
friend class baz;
};
class baz
{
public:
foo Foo;
bar Bar;
baz() { Bar.state = Foo.state; }
};
それは問題ありませんが、一定のスマート ポインターを渡すと、カプセル化の原則に違反します。
システムの内部を公開します。bar を foo に渡すと、カップリングも作成されます。また、私のシステムでは、その質問で流暢なインターフェースと呼ばれるものにオブジェクトを集約することは理にかなっています。
MainObject.PropertyCollection.Property
そのSOの答えで言われているように、それはデメテルの法則に違反していませんか?
私はここで非常に混乱しています。
私は最後に自分のライブラリを再設計していますが、それを正しくしたいと思っています。
内部スマート ポインターを渡す代わりに、プロパティとしても使用されるラッパー クラスを渡し、それを読み取り専用に設定してから、コピーは安全だと思いましたか?
コメントに従って編集:まあ、私はD20 3.5 SRD(http://www.d20srd.org/)を実装しています。
たとえば、6 つの能力があります。
私の設計では、D20Abilities は D20Character 内に集約されています。
D20Abilities には、Strength、Dexterity、Constitution の 6 つの D20Ability インスタンスが含まれています。知恵、知性、カリスマ。
すべての D20Ability インスタンスは、システム全体で共有されるプライベート ステート (修飾子と呼ばれる) を保持します。たとえば、各スキルには独自の能力の修飾子が必要です。