如果我有两节课:
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 ) 中获得更多信息。