一个基本的复合模式在这里就足够了。要实现这一点,您在基类中将成员函数声明为虚拟Transition
。这将允许您维护 中的Transition
对象列表Transition_Container
,遍历列表并调用适当的成员函数。
#include <vector>
class Transition
{
public:
// default impementation that does nothing
virtual void SetMatrix(Matrix*) {}
};
class Transition_Container : public Transition
{
std::vector<Transition*> transitions_;
public:
virtual void SetMatrix(Matrix* pStartMatrix)
{
for(std::vector<Transition*>::iterator it = transitions_.begin();
it != transitions_.end();
++it)
{
(*it)->SetMatrix(pStartMatrix);
}
}
};
如果您不想Transition
了解可以使用的各种数据类型,可以使用boost:any
和boost:any_cast
。这与上面的建议非常相似,但消除了Matrix
和Vector
from的依赖关系,并将Transition
处理不同类型的责任置于派生自它的类的实现上。我只建议在存在绝对阻止Transition
了解Matrix
andVector
类型的某些要求时这样做。
#include <vector>
#include <boost/any.hpp>
class Transition
{
public:
// default impementation that does nothing
virtual void SetValue(boost::any&) {}
};
class Transition_Matrix : public Transition
{
virtual void SetValue(boost::any& value)
{
try
{
Matrix *matrix = boost::any_cast<Matrix*>(value);
// do stuff
}
catch(const boost::bad_any_cast &)
{
return;
}
}
};
class Transition_Container : public Transition
{
std::vector<Transition*> transitions_;
public:
template<Arg>
void SetValueT(Arg* arg)
{
boost::any value = arg;
SetValue(value);
}
virtual void SetValue(boost::any& value)
{
for(std::vector<Transition*>::iterator it = transitions_.begin();
it != transitions_.end();
++it)
{
(*it)->SetValue(value);
}
}
};
我建议使用shared_ptr
或unique_ptr
来自 Boost 或 C++11 标准库来维护这样的Transition
对象列表。
std::vector<std::shared_ptr<Transition>> transitions_;
我没有在上面的示例中包含它,因为我不知道您是否熟悉使用它。如果你不是我建议调查一下。