C++ 应在何处删除由factory方法创建的对象?

C++ 应在何处删除由factory方法创建的对象?,c++,design-patterns,factory,factory-pattern,C++,Design Patterns,Factory,Factory Pattern,通过returnShapeType创建的对象应如何删除,在何处删除? 这是一个工厂方法演示程序 请出示密码 class Shape { public: Shape() {} virtual void print() {std::cout << "\nFrom shape print";} }; class Triangle: public Shape { public: Triangle(){} virtual void print() {std::

通过
returnShapeType
创建的对象应如何删除,在何处删除?
这是一个工厂方法演示程序

请出示密码

class Shape
{
public:
    Shape() {}
    virtual void print() {std::cout << "\nFrom shape print";}
};

class Triangle: public Shape
{
public:
    Triangle(){}
    virtual void print() {std::cout << "\nFrom triangle print";}
};

class Rectangle: public Shape
{
public:
    Rectangle(){}
    virtual void print() {std::cout << "\nFrom rect print";}
};

class CreateShapeObject
{
public:
    CreateShapeObject() {}

    Shape *returnShapeType( std::string arg )
    {
        if (arg == "Triangle")
            return new Triangle;
        else if (arg == "Rectangle")
            return new Rectangle;
    }
};

////////////

class EndDeveloper
{
public:
    CreateShapeObject obj;

    EndDeveloper()
    {
        Shape *p = obj.returnShapeType("Triangle");
        p->print();

        Shape *q = obj.returnShapeType("Rectangle");
        q->print();


    }
};
类形状
{
公众:
形状(){}

virtual void print(){std::cout通过工厂处理
new
的任何使用,就像处理
new
的任何其他使用一样

也就是说,使用
new
(是否通过工厂)的代码/类也负责执行
删除

通过工厂处理
new
的任何使用,就像处理
new
的任何其他使用一样

也就是说,使用
new
(通过工厂或非工厂)的代码/类别也负责执行
删除

您必须在设计中确立所有权原则

在发布的代码中,
CreateShapeObject
不保留指向已构造对象的指针。它只返回指向已构造对象的指针。这意味着调用函数/类必须拥有该对象的所有权。除非将所有权传递给另一个函数/类,否则它们应该负责删除该对象在这种情况下,其他函数/类应该负责删除它


如果您想让
CreateShapeObject
负责删除它构造的对象,则必须更新它以跟踪它构造的对象。此时,您可能需要更改类的名称以反映双重责任。类似于
ShapeObject Manager
的内容将使nse。

您必须在设计中确立所有权原则

在发布的代码中,
CreateShapeObject
不保留指向已构造对象的指针。它只返回指向已构造对象的指针。这意味着调用函数/类必须拥有该对象的所有权。除非将所有权传递给另一个函数/类,否则它们应该负责删除该对象在这种情况下,其他函数/类应该负责删除它


如果您想让
CreateShapeObject
负责删除它构造的对象,则必须更新它以跟踪它构造的对象。此时,您可能需要更改类的名称以反映双重责任。类似于
ShapeObject Manager
的内容将使nse。

使用原始指针容易出错。请使用
唯一\u ptr

std::unique_ptr<Shape> returnShapeType(const std::string& arg)
{
    if (arg == "Triangle")
        return std::make_unique<Triangle>();
    else if (arg == "Rectangle")
        return std::make_unique<Rectangle>();
    throw std::invalid_argument("Invalid shape");
}
std::shared_ptr<Shape> shape = obj.returnShapeType("Triangle");
唯一\u ptr
也可以隐式转换为
共享\u ptr

std::unique_ptr<Shape> returnShapeType(const std::string& arg)
{
    if (arg == "Triangle")
        return std::make_unique<Triangle>();
    else if (arg == "Rectangle")
        return std::make_unique<Rectangle>();
    throw std::invalid_argument("Invalid shape");
}
std::shared_ptr<Shape> shape = obj.returnShapeType("Triangle");
std::shape=obj.returnShapeType(“三角形”);

使用原始指针容易出错。请使用
唯一\u ptr

std::unique_ptr<Shape> returnShapeType(const std::string& arg)
{
    if (arg == "Triangle")
        return std::make_unique<Triangle>();
    else if (arg == "Rectangle")
        return std::make_unique<Rectangle>();
    throw std::invalid_argument("Invalid shape");
}
std::shared_ptr<Shape> shape = obj.returnShapeType("Triangle");
唯一\u ptr
也可以隐式转换为
共享\u ptr

std::unique_ptr<Shape> returnShapeType(const std::string& arg)
{
    if (arg == "Triangle")
        return std::make_unique<Triangle>();
    else if (arg == "Rectangle")
        return std::make_unique<Rectangle>();
    throw std::invalid_argument("Invalid shape");
}
std::shared_ptr<Shape> shape = obj.returnShapeType("Triangle");
std::shape=obj.returnShapeType(“三角形”);

您所说的“何处”?何时?何处(在哪一类中)是什么意思执行此操作的代码应该是?最好的策略是不返回需要手动删除的内容,从而使问题变得毫无意义。智能指针是一种常用的糟糕解决方案。但您可以将动态分配的对象包装成自己的类型,自动管理资源。@juanchopanza您能详细说明“糟糕的解决方案”吗?例如,我认为返回唯一指针没有问题?@andreee它仍然是一个指针,具有指针和引用语义。@juanchopanza“但您可以将动态分配的对象包装成自己的类型,自动管理资源。”请在回答中举例说明。您所说的“where”是什么意思?何时?何地(在哪个级别)执行此操作的代码应该是?最好的策略是不返回需要手动删除的内容,从而使问题变得毫无意义。智能指针是一种常用的糟糕解决方案。但您可以将动态分配的对象包装成自己的类型,自动管理资源。@juanchopanza您能详细说明“糟糕的解决方案”吗?例如,我认为返回唯一指针没有问题?@andree它仍然是一个指针,具有指针和引用语义。@juanchopanza“但您可以将动态分配的对象包装成自己的类型,自动管理资源。”请在回答中举例说明。该函数不返回我可以在析构函数中获取并删除的任何变量。我如何删除“返回新三角形”?该函数的意思是
Shape*returnShapeType(std::string arg)
?我很困惑。“不返回任何变量”是什么意思?它不应该返回一个变量,它返回一个指向新创建对象的指针。删除创建的对象只需要该指针。这是否意味着我应该这样写:
delete p
其中p是最终用户类构造函数中的形状指针?仅当您不打算在构造函数之后使用该对象时。哪个似乎有点奇怪。如果你指的是“析构函数”,那么是的,这将是一个如何做的示例,如果父对象的销毁是在你知道你将不再使用该对象的时候。该函数不会返回我可以在析构函数中获得并删除的任何变量。我如何删除“返回新三角形”“那个函数”你的意思是
Shape*returnShapeType(std::string arg)
?我很困惑。“不返回任何变量”是什么意思"?它不应该返回一个变量,它返回一个指向新创建对象的指针。删除创建的对象只需要该指针。这是否意味着我应该这样写:
delete p
其中p是最终用户类构造函数中的形状指针?仅当您不打算在构造函数之后使用该对象时。哪个似乎有点奇怪。如果你指的是“析构函数”,那么是的,这将是一个如何做的示例,如果