2011-01-30 35 views
1

所以像我们可以把这样的结构变成类型化的类/函数吗?

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*intAddSubscriberToGeneratedData。如何做这样的事情?

+0

请参阅我的答案中的编辑。 – Nawaz 2011-01-30 20:19:08

回答

2

我们可以把 simpleRendererGraphElement *为 抽象类型,使我们在结构使用 (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初始化该指针。我认为,你应该阅读关于虚函数和运行时多态性。这会帮助你很多。

+0

我理解这个想法有多好,但我不知道如何实现它。这就是我问的原因。 – Rella 2011-01-30 20:03:23

相关问题