2

我有几个专业课。例如

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 知道它有哪些孩子。但是我想要在容器上调用这些函数的方便,这样我就不必搜索子项并找出在“转换”矩阵或向量时应该调用哪些函数。

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

基本上我想在根容器上设置一个矩阵或向量,并让它向下传播到每个孩子,而不是可能想要使用它。

想法?

4

1 回答 1

0

一个基本的复合模式在这里就足够了。要实现这一点,您在基类中将成员函数声明为虚拟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:anyboost:any_cast。这与上面的建议非常相似,但消除了MatrixVectorfrom的依赖关系,并将Transition处理不同类型的责任置于派生自它的类的实现上。我只建议在存在绝对阻止Transition了解MatrixandVector类型的某些要求时这样做。

#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_ptrunique_ptr来自 Boost 或 C++11 标准库来维护这样的Transition对象列表。

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

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

于 2013-06-22T00:17:55.657 回答