抽象クラスと2つの具象サブクラス(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) {}
};