gpt4 book ai didi

c++ - 有特殊 child 的容器模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:56:49 25 4
gpt4 key购买 nike

我有几个专业类(class)。例如

class Transition_Matrix : public Transition
{
SetMatrix(Matrix* pStartMatrix);
};

class Transition_Vector : public Transition
{
SetVector(Vector* pStartVector);
}

class Transition_Container : public Transition
{

}

我想在 Animate_Container 上调用 SetVector() 或 SetMatrix() 而无需为需要设置的每种类型的对象声明函数。例如,我不想按如下方式声明 Animate_Container...

class Transition_Container : public Transition
{
SetMatrix(Matrix* pStartMatrix);//loops through all children calling SetMatrix
SetVector(Vector* pStartVector);//loops through all children calling SetVector
}

我不想让 Animate_Container 知道它有哪些 child 。但是我想要在容器上调用这些函数的便利性,这样我就不必搜索子项并找出在“转换”矩阵或 vector 时应该调用哪些函数。

我应该在这里使用的正确模式是什么?

基本上,我想在根容器上设置一个矩阵或 vector ,并让它向下传播到每个可能想要使用它的 child 。

想法?

最佳答案

基础 composite pattern在这里就足够了。为实现这一点,您在基类 Transition 中将成员函数声明为虚拟的。这将允许您在 Transition_Container 中维护一个 Transition 对象列表,遍历该列表并调用适当的成员函数。

#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:anyboost:any_cast。这与上面的建议非常相似,但是从 Transition 中移除了 MatrixVector 的依赖,并将处理不同类型的责任放在从它派生的类的实现。我只建议在有一些要求绝对阻止Transition了解MatrixVector类型时这样做.

#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);
}
}

};

我建议使用 Boost 或 C++11 标准库中的 shared_ptrunique_ptr 来维护 Transition 对象的列表,就像这样。

std::vector<std::shared_ptr<Transition>> transitions_;

我没有在上面的例子中包括这个,因为我不知道你是否熟悉使用它。如果您不是,我建议您调查一下。

关于c++ - 有特殊 child 的容器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17245965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com