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