コンテキスト:最近のC++で集約を実装する正しい方法は何ですか?
私が集約を必要とする状況が発生するのが一般的である:オブジェクトは、それを所有することなく、別のオブジェクトを使用しています。つまり、いくつかのメインモジュールは、他の人のためにオブジェクトを作成して共有します。
しかし、これまで実装した正しい方法は見つかりませんでした。
前研究:
1)C-様ポインタ: 共有オブジェクトがポインタとして提供されます。問題は、作成、共有、および削除の順序を正しく管理することはプログラマが責任を持って行うことであり、手軽にポインタを運ぶことができます。
int main()
{
A a;
B b(&a);
return 0;
}
2)弱いポインタ: 共有/弱いポインタはダングリングポインタの問題を解決するための使用。主な問題は、スタックオブジェクトを使用しないようにすることです。また、最悪の場合には(カーネル/低レベルのコード)は不可能であるという例外的なケースでは、議論のトピックが最良のケースで中継されます。
int main()
{
std::shared_ptr<A> a(new A());
std::weak_ptr<A> wa = a; // optional, but required to show the weak_ptr use
B b(wa);
}
3)共有のポインタ: のみ共有ポインタを使用するには、以下同じ問題を抱えている(2)が、さらにAの所有権が不明です:いくつかの設計ガイドラインを破ること。
4)オブジェクト参照: オブジェクトへの参照を共有すると、問題が解決され、おそらく最も簡単な解決策です。一方、それは集約されたオブジェクトをコンストラクタに渡すよう強制し、代入演算子を回避し、一般にデザインを制限します。
int main()
{
A a;
B(a);
}
5)集計しないで、引数として渡すだけです。 可能であれば、これによって一部の機能のパラメータ数が大幅に増加します。それは、私の意見では、あまりにも多くの複雑さです。
6)シングルトンパターン シングルトンを使用すると、複数のモジュールから1つのオブジェクトにアクセスできます。しかし、これは1つのインスタンスを共有することしか許さず、いくつかの設計ガイドラインに反する。
質問:
現代のC++での集約を実装するための正しい方法は何ですか?
理想の目標は次のようになります。
- コードを維持し、エラーを回避するのは簡単ください。
- さまざまな方法で使用する柔軟性(例:スタック/ヒープ)
- 余計な複雑さやあいまいなコードではありません。
質問に答えるのに十分な情報がないと思います。これは、共有しているよりも多くのアーキテクチャ上の考慮事項に依存します。これらは、他のものに応じて有効なオプションですが、 "現代的な" C++では、可能であれば生ポインタを使用したくない場合がほとんどです(ほとんどの場合、 'new'を使う必要はありません) – johnbakers
ありません。回答。特定の問題を解決するための最良の設計を選んでください。 –
BはなぜAを所有していないのですか?ヒープを再利用するためのカスタムガベージコレクタがありますか? BはAよりも寿命が長いですか? – vegi