所以在像
这样的结构中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
的抽象类函数。怎么做这个?
答案 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
初始化此指针。我想,你应该阅读有关虚函数和运行时多态的内容。这对你有很大的帮助。