我有一个抽象类和两个具体子类 (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/