0

我有一个抽象类和两个具体子类(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) {}
};
4

2 回答 2

2

你没有make_shared正确使用。利用:

std::make_shared<ConcreteFactory>();

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

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

于 2012-07-16T09:29:32.357 回答
0

您可能需要以下两件事之一来使您的智能指针方法起作用:

  1. 制作ConcreteFactoryAConcreteFactoryB返回一个std::shared_ptr<AbstractFactory>or std::unique_ptr<AbstractFactory>。只需在您的“存储”类中分配或更好地初始化

  2. 使用构造函数shared_ptr<>从原始指针初始化你的 sstd::shared_ptr<>::reset

您通常只使用与原始指针一起使用std::make_shared<>的智能指针。new在您的情况下,您只是分配指针,因此您不应该使用它。

于 2012-07-16T09:33:19.817 回答