【发布时间】:2014-01-04 19:39:23
【问题描述】:
我有一个如下设计的类:
class Meal {
public:
virtual void cook() = 0; // pure virtual
}
class Omelette : Meal {
public:
void cook() {/*do something*/}; // non-virtual
}
class Waffle : Meal {
public:
void cook() {/*do something*/}; // non-virtual
}
std::vector< std::unique_ptr<Meal> > menu;
void addMeal(const Meal& meal) {
menu.emplace_back(new Meal(meal)); // cannot allocate an object of abstract type
}
我无法找到将Meal 派生对象添加到menu 的方法,因为我无法创建抽象对象。有没有办法执行上述代码?
我希望Meal 保持抽象。我可以传入一个指向现有 Meal 派生对象的指针,但我的 unique_ptr 几乎不是唯一的。
【问题讨论】:
-
传入
unique_ptr<Meal>;emplace_back会将其移动到向量中。这是您记录所有权转让的方式。或者,使用shared_ptr共享所有权 - 以最适合您设计的其余部分为准。 -
添加一个名为
clone的虚函数并让每个派生类实现它。在addMeal函数中使用该函数。 -
如@IgorTandetnik 所说,将非过期指针的创建委托给知道它们操作的对象应该工作的代码
-
这就是factory pattern 派上用场的地方