从工厂返回静态或动态分配的对象
Return a statically or dynamically allocated object from a factory?
基本上,这是:
Cat CatFactory::CreateCat()
{
return Cat();
}
或者这个:
Cat* CatFactory::CreateCat()
{
return new Cat();
}
我知道一般的建议是尽可能避免新的,并且倾向于在堆栈上创建对象,这样就不必使用delete。这也适用于工厂吗?我看到的所有例子都倾向于使用新的关键字。为什么会出现这种情况?
我不能使用智能指针,因为这是一个类项目,每个人都是C++的新手,我们以后必须集成我们的项目。
我看到的所有例子都倾向于使用新的关键字。为什么会出现这种情况?
因为工厂模式通常用于避免将构造函数和类层次结构的知识(在许多系统中都是实现细节!)泄露给调用者;如果要返回Cat
的子类实例而不是Cat
:,则需要使用它
Cat *make_cat(int type)
{
switch (type) {
case TABBY:
return new Tabby();
case TORTOISESHELL:
return new Tortoiseshell();
// etc.
}
};
如果按值返回,则无法执行此操作。
按值返回的其他原因包括不可复制的对象。如果您不喜欢使用原始指针,并且现代C++风格有它,那么请返回unique_ptr
或shared_ptr
。
这一切都取决于你在应用程序上下文中所说的"对象"(在抽象意义上)是什么意思,你如何识别它,以及多态性必须尊重它的作用。
如果您的对象不需要是多态的,并且您可以通过值来识别它们,那么可以通过值传递它们(或者在C++11中"移动"它们),所以实际上,您可以使用"值语义"。在这种情况下,两个都包含"abc"的变量是"相等的",并被认为在不同的地方(范围)代表"同一件事"。
如果您通过对象在内存中的位置(也称为地址)来识别对象,则必须传递指针或引用,这样就不会进行复制。在这种情况下,两个都包含"abc"的不同变量被认为是"代表不同的东西,顺便说一句,看起来是一样的"。
如果需要多态性,那么必须通过指针传递(或通过引用传递,但不是通过值传递),因为C++多态性是通过间接方式操作的。
基于OOP的程序往往遵循第二种范式。功能性或通用程序往往遵循第一个。
这里的要点是,"工厂模式"是一种面向对象的技术,在面向对象的世界之外并不那么有趣。
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- C 删除指向动态分配对象的指针
- 有关动态分配对象的问题
- 如何删除用于动态分配对象的智能指针
- C++函数返回指向动态分配对象的指针
- 如何创建指向动态分配对象的指针向量
- 动态分配对象数组,如 int
- 复制构造动态分配对象的问题
- 在类中动态分配对象指针的2D数组
- 在C++循环中正确删除动态分配对象的位置
- 如何获取指向动态分配对象的指针的基址
- 动态分配对象数组
- 如何删除指向动态分配对象的指针数组
- 返回对动态分配对象的引用
- 动态分配对象生成器
- 如何正确管理动态分配对象的内存
- 为什么valgrind显示泄漏,即使包含动态分配对象的向量被释放