我们可以将这种结构转换为类型类/函数吗?

时间:2011-01-30 10:48:16

标签: c++ oop events templates function-pointers

所以在像

这样的结构中
struct RenderCastedDataFunctor
{
    simpleRendererGraphElement* obj_;

    RenderCastedDataFunctor(simpleRendererGraphElement* obj)
        : obj_(obj) { }

    void operator()(char* castedChar, int castedCharLength)
    {
        obj_->renderCastedData(castedChar, castedCharLength);
    }
};

我们可以将simpleRendererGraphElement *转换为抽象类型并使其在结构(renderCastedData)中使用它的函数名称也是抽象的吗?

所以我在charGenerator

中有一个函数
template <typename Function>
void AddSubscriberToGeneratedData(Function f)

我想从type void (differentClass::*)(char*, int)

的不同类传递给它的函数

在一些simpleRendererGraphElement中使用该结构,我可以将名为renderCastedData的函数订阅到数据 charGenerator->AddSubscriberToGeneratedData(RenderCastedDataFunctor(this)); 我希望有一种方法能够传递将char*int传递给AddSubscriberToGeneratedData的抽象类函数。怎么做这个?

1 个答案:

答案 0 :(得分:2)

  我们可以转   simpleRendererGraphElement * into   抽象类型并使其功能   我们在结构中使用的名称   (renderCastedData)抽象呢?

非常好主意。你应该做这个。通过使其成为函数virtual使类抽象化,然后定义实现虚函数的具体类(从此抽象类派生)。那将是一个更好的设计!

剩下的似乎已经很好了。你没有做任何事情,因为你这样做:

AddSubscriberToGeneratedData(RenderCastedDataFunctor(this));

我想,这里this表示指向具体类实例的指针。如果是这样,那应该有用!


编辑:

  

我明白这个想法有多好   我不知道如何实现它。那   这就是我要问的原因。

好的。这是一个例子:

class AbstractGraphElement
{
  public:
    virtual void RenderCastedData(char* castedChar, int castedCharLength) = 0;
};

这是您的抽象类,RenderCastedData是纯虚函数。现在您需要定义一个必须定义RenderCastedData函数的具体类。所以这就是:

class SimpleGraphElement : public AbstractGraphElement
{
  public:
    virtual void RenderCastedData(char* castedChar, int castedCharLength)
    {
        //function body - define it yourself
    }
};

完成!

现在你需要做的就是这个。修改RenderCastedDataFunctor,如下所示:

struct RenderCastedDataFunctor
{
    AbstractGraphElement* m_graphElement;

    RenderCastedDataFunctor(AbstractGraphElement* graphElement)
        : m_graphElement(graphElement) { }

    void operator()(char* castedChar, int castedCharLength)
    {
        m_graphElement->RenderCastedData(castedChar, castedCharLength);
    }
};

然后添加订阅者

AbstractGraphElement *pGraphElement = new SimpleGraphElement();
AddSubscriberToGeneratedData(RenderCastedDataFunctor(pGraphElement));

我认为它给了你一些想法,对吧?重要的一点是:使用AbstractGraphElement类型的指针,但用SimpleGraphElement初始化此指针。我想,你应该阅读有关虚函数和运行时多态的内容。这对你有很大的帮助。