c++ - 我们能把这样的结构变成类型化的类/函数吗?

标签 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。怎么办?

最佳答案

can we turn simpleRendererGraphElement* into abstract type and make its function name we use in structure (renderCastedData) abstract too?

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

其余的似乎已经很好了。您无需执行任何操作,因为您正在执行此操作:

AddSubscriberToGeneratedData(RenderCastedDataFunctor(this));

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


编辑:

I understand how good this Idea is but I do not get how to implement it. that is why I am asking.

好的。这是一个例子:

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 初始化此指针。我认为,您应该阅读虚函数和运行时多态性。那会对你有很大帮助。

关于c++ - 我们能把这样的结构变成类型化的类/函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4842472/

相关文章:

c++ - 对于生产者和多个消费者来说,std::queue 线程是安全的

c++ - 关于 C++17 中尾随返回类型的问题

javascript - 在事件处理程序上使用 bind(this)

events - Firefox OS 中的广播事件

java - 为多个源生成唯一 ID

c++ - 我如何在 Eigen 中创建复数矩阵

c++ - 用 constexpr 中的 union 替换 reinterpret_cast - 好主意?

php - 如何在 PHP 的静态函数中返回当前对象

oop - OO原理: c#: design to interface and not concrete classes

linux - 如何禁用 Qt 在 Linux 上捕获小部件焦点导航箭头键的行为