c++ - 抽象类中的复制控件

标签 c++ shared-ptr copy-constructor

我有一个抽象类和两个具体子类 (Store),它们都有一个指向另一个派生自抽象类 (Factory) 的具体子类的指针。下面是商店的代码。我想防止内存泄漏,所以我开始写复制控件。但是,我无法实例化一个新工厂,因为我事先不知道它将是什么类型。避免这种情况的好习惯是什么?我可以在具体的 Stores 中编写复制控件,但是我有重复的代码。 我也尝试过使用智能指针,但我发现了另一个困难。片段 myFactory = std::make_shared<AbstractFactory>(ConcreteFactoryA());显然首先创建一个 AbstractFactory,然后用 ConcreteFactoryA 填充它。然而,顾名思义,AbstractFactory 不能被实例化,正如编译器告诉我的那样。可以将 shared_ptr 与抽象类一起使用吗?

带有普通指针的代码:

#pragma once
#include "AbstractFactory.h"

class AbstractStore
{
public:
    // Copy control
    AbstractStore(const AbstractStore& orig) : myFactory(new AbstractFactory(orig.myFactory)) {}
    AbstractStore& operator=(const AbstractStore& orig) { return *this; } // TODO
    ~AbstractStore(void) {}
protected:
    // Constructor
    AbstractStore(void) {}
    // Data members
    AbstractFactory* myFactory;
};

class ConcreteStoreA : public AbstractStore
{
public:
    ConcreteStoreA(void) { myFactory = new ConcreteFactoryA; }
    ~ConcreteStoreA(void) {}
};

class ConcreteStoreB : public AbstractStore
{
public:
    ConcreteStoreB(void) { myFactory = new ConcreteFactoryB; }
    ~ConcreteStoreB(void) {}
};

带有智能指针的代码:

#pragma once
#include "AbstractFactory.h"
#include <memory>

class AbstractStore
{
public:
    // Copy control
    AbstractStore(const AbstractStore& orig) : myFactory(orig.myFactory) {}
    AbstractStore& operator=(const AbstractStore& orig) { myFactory = orig.myFactory; return *this; }
    ~AbstractStore(void) {}
protected:
    // Constructor
    AbstractStore(void) {}
    // Data members
    std::shared_ptr<AbstractFactory> myFactory;
};

class ConcreteStoreA : public AbstractStore
{
public:
    ConcreteStoreA(void) { myFactory = std::make_shared<AbstractFactory>(ConcreteFactoryA()); }
    ~ConcreteStoreA(void) {}
};

class ConcreteStoreB : public AbstractStore
{
public:
    ConcreteStoreB(void) { myFactory = std::make_shared<AbstractFactory>(ConcreteFactoryB()); }
    ~ConcreteStoreB(void) {}
};

最佳答案

您没有使用 make_shared正确。使用:

std::make_shared<ConcreteFactory>();

你在这里调用它没有任何参数。 make_shared不接受构造的对象,而是接受转发给它的构造函数的参数。在您的情况下,您将转发到复制构造函数,它在抽象层次结构中效果不佳。如果您想要层次结构中的可复制对象,请使用 clone具有协变返回类型的成员函数。

这将返回 shared_ptr<ConcreteFactory>将转换为 shared_ptr<AbstractFactory>在赋值中(参见 (9) here 。另外,使用构造函数初始化列表和虚拟析构函数。

关于c++ - 抽象类中的复制控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501409/

相关文章:

c++ - 来自虚函数的 undefined reference

c++ - 共享指针和多线程

c++ - shared_ptr 的静态成员函数 make_shared

c++ - 将 shared_ptr 传递给线程

c++ - 在初始化时强制执行赋值运算符而不是复制构造函数?

c++ - 在C++中,如何正确获取指向 vector 的共享指针,最大限度地减少复制构造函数的调用次数?

c++ - 从书本上学习 C++ 无法让这个程序与类一起工作

c++ - 没有匹配的构造函数来初始化模板类的构造函数

c++ - reinterpret_cast<int*>(char*) 与 static_cast<int*>(static_cast<void*>(char*)) - 使用哪个?

c++ - 是否可以将 "add"设置为默认的复制构造函数?