これらの C++ クラスを次のように定義しています。
class A
{
public:
B *createB();
};
class B
{
public:
virtual void fun() = 0;
};
class B1 : B {/* ... */};
class B2 : B {/* ... */};
したがって、基本的に B は抽象クラスであり、B1 と B2 は B の具体的な実装であり、A はコードのどこかに B 型のインスタンスを作成します。A は factoryではなく、A::createB
単なる例であることに注意することが重要です。
A の初期化中に B のサブクラスを渡すことができるようにしたいので、実行時に必要に応じて後者によって前者のインスタンスを作成できます。例:
A *a1 = /* sorcery here */;
A *a2 = /* another magic code */;
a1->createB(); // getting B1
a2->createB(); // getting B2
それを達成するための最良の方法は何ですか?テンプレートを使わなくても可能ですか?
回答に基づいて、私はこれに行き着きました。ありがとう!
class B
{
public:
virtual void fun() = 0;
virtual B *clone() = 0;
};
class B1 : public B
{
public:
virtual void fun()
{
std::cout << "B1" << std::endl;
}
virtual B *clone()
{
return new B1();
}
};
class B2 : public B {/* analogous to B1 */};
class A
{
public:
A(B *b) : b(b) {};
B *createB()
{
return b->clone();
}
private:
B *b;
};
A(new B1()).createB()->fun(); // prints "B1"
A(new B2()).createB()->fun(); // prints "B2"