2 つのクラスがある場合:
class A{
f();
}
class B{
f();
};
次のような条件に基づいて、これらのクラスのいずれかをオブジェクトに割り当てる必要があります。
define variable
if condition1
variable = A
else
variable = B
そして、割り当てられたvariable.f();
提供されA
、B
無関係な型 (つまり、継承階層の一部ではない) であることを意図している場合、Boost.Variant をboost::static_visitor<>
クラスと組み合わせて使用して、同様のことを実現できます。
#include <boost/variant.hpp>
#include <iostream>
struct A { void f() { std::cout << "A::f();" << std::endl; } };
struct B { void f() { std::cout << "B::f();" << std::endl; } };
struct f_caller : boost::static_visitor<void>
{
template<typename T>
void operator () (T& t)
{
t.f();
}
};
bool evaluate_condition()
{
// Just an example, some meaningful computation should go here...
return true;
}
int main()
{
boost::variant<A, B> v;
if (evaluate_condition())
{
A a;
v = a;
}
else
{
B b;
v = b;
}
f_caller fc;
v.apply_visitor(fc);
}
継承と仮想関数に注目する必要があります。コードは次のようになります
class Base
{
virtual void f() = 0;
};
class A : public Base
{
virtual void f()
{
//class A realization of f
}
};
class B : public Base
{
virtual void f()
{
//class B realization of f
}
};
そして、あなたはこれを行うことができます
Base* VARIABLE = 0;
if (*condition*)
{
VARIABLE = new A();
}
else
{
VARIABLE = new B();
}
VARIABLE->f();
しかし、継承と仮想関数を使用することは必ずしも良い考えではありません。クラス A と B には、少なくとも関数 f() の意味について共通点があるはずです。
あなたがしていることは、デザインパターンでは「ファクトリーパターン」として知られています。上記の回答は、実装方法をカバーしています。詳細については、C++ でファクトリ メソッド パターンを正しく実装する方法と wiki ( http://en.wikipedia.org/wiki/Factory_method_pattern ) を参照してください。