C++ 使用boost工厂按需求生产产品C++;

C++ 使用boost工厂按需求生产产品C++;,c++,boost,factory,C++,Boost,Factory,让我困惑的是,我不想创建一个带有“Product_ptr productA”指针的对象,还有其他方法吗?另一个问题是,我的所有产品都使用DoSomething(),但我还想为不同的产品添加不同的属性,如何实现这一点?谢谢你的建议 > P>在处理动态创建的对象时,一般不能避免C++中的指针。您必须管理并传递此类对象的所有权,这自然是通过指针完成的,当然主要是智能指针 尽管有一些方法可以隐藏它们,例如,在某个中心点(工厂)维护对象的所有权,并通过引用将其传递给消费者。这种方式有几个缺点,例如,消费者

让我困惑的是,我不想创建一个带有“Product_ptr productA”指针的对象,还有其他方法吗?另一个问题是,我的所有产品都使用DoSomething(),但我还想为不同的产品添加不同的属性,如何实现这一点?谢谢你的建议

> P>在处理动态创建的对象时,一般不能避免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();
...
模板
阶级工厂
{
//列表元素不受插入/删除的影响
//如果对象需要,还可以是智能指针的容器
//直接在堆上创建
标准:列出m_对象;
公众:
Product&CreateProduct()
{
m_objects.push_back(Product());
返回m_objects.back();
} 
};
//用法
工厂;
MyProduct&prod=factory.CreateProduct();
...
这个解决方案是可能的,但有局限性,没有实际需要不要使用它。
最好从工厂返回适当的智能指针,例如
std::shared_ptr
,因为它为您提供了对象所有权的明确语义,并使代码更加清晰、可维护和防错。

请澄清您所说的“为不同产品添加不同属性”是什么意思?我觉得这很好。智能指针(
std::unique_ptr
)是解决生命周期管理问题的解决方案。@sehe嘿,恐怕指针不是解决内存问题的好方法,实际上,我应该处理不同的后端,DoSomething()在这里就像序列化一样,它会将其属性发送到其他后端,并得到回复,做非序列化,所以我想使用对象,而不是指针,因为我不能想象地址问题…谢谢you@Rost产品的属性将不同,可能productA需要两个字符串成员,但productB需要三个int成员……属性有什么问题?只需将相应的数据成员添加到
ConcreteProductA
ConcreteProductB
。或者您需要将它们传递给施工中的产品?