私を混乱させたのは、「Product_ptr productA」のようなポインターを持つオブジェクトを作成したくないということです。他の方法はありますか? もう 1 つの質問は、すべての製品で DoSomething() を使用しているということですが、製品ごとに異なる属性を追加したいのですが、どうすればこれを実現できますか? あなたの提案をありがとう!!
質問する
310 次
1 に答える
1
一般に、動的に作成されたオブジェクトを処理する場合、C++ ではポインターを避けることはできません。そのようなオブジェクトの所有権を管理して渡す必要がありますが、これは当然、ポインター (主にスマート ポインター) を使用して行われます。
それらを非表示にする方法はいくつかありますが、たとえば、オブジェクトの所有権をある中心点 (ファクトリ) で維持し、それらを参照によって消費者に渡します。このような方法にはいくつかの欠点があります。たとえば、ファクトリがオブジェクトを破棄してリソースを無駄にしないように、消費者はオブジェクトを明示的に解放する必要があります。ただし、オブジェクトが軽量で、その寿命がプログラム全体または特定のファクトリの寿命と同じである場合、これは役立つ可能性があります。
例:
template <class Product>
class Factory
{
// List elements are unaffected by insertion/deletion
// Could be also container of smart pointers if objects need
// to be created directly on heap
std:list<Product> m_objects;
public:
Product& CreateProduct()
{
m_objects.push_back(Product());
return m_objects.back();
}
};
// Usage
Factory<MyProduct> factory;
MyProduct& prod = factory.CreateProduct();
...
この解決策は可能ですが、制限があります。実際に必要がない場合は使用しないでください。ファクトリから適切なスマート ポインターを返すことstd::shared_ptr
は、たとえば、オブジェクトの所有権に関する明示的なセマンティクスを提供し、コードをより明確にし、保守しやすく、エラーを防止するため、望ましいです。
于 2012-10-19T16:28:43.420 に答える