从派生类隐式调用函数

时间:2017-01-24 13:20:21

标签: c++ c++11 c++14 software-design

在我的main.cpp中,我有类似于以下内容:

void OnEventStart(int id)
{
    // Do some stuff
}

此函数是一个回调函数,它只在事件发生时触发(由主sdk发出)。

我现在有这个课程:

class SomeClass {
public:
    void OnEventStart(int id);
};

void SomeClass::OnEventStart(int id)
{
    // Do some other stuff
}

现在我想触发void SomeClass::OnEventStart(int id)而不做这样的事情:

SomeClass class;
void OnEventStart(int id)
{
     // Do some stuff

     class.OnEventStart(id);

     // AnotherClass.OnEventStart(id);
     // Another.OnEventStart(id);
}

可以想象,使用这样的方法很容易使初始函数/回调混乱。

1 个答案:

答案 0 :(得分:1)

您的问题不是很清楚,但我会假设以下内容:

  • 你有某种回调处理程序需要void(*)(int)

在这种情况下,如果SomeClass是无状态的,您只需使用lambda包装器:

my_framework_callback([]{ SomeClass{}.OnEventStart(id); });

如果我误解了你的要求,这里有一个不同的假设:

  • SomeClass和类似的类型无状态

  • 您只需调用其中一种方法即可实例化SomeClass,这让您很恼火。

如果是这种情况,您可以当场创建SomeClass临时实例

void OnEventStart(int id)
{
     SomeClass{}.OnEventStart(id);
     AnotherClass{}.OnEventStart(id);
     Another{}.OnEventStart(id);
}

如果你的问题是......

  

"我有各种具有相同界面的类,我想在所有这些类上调用一个函数。"

...然后一个可能的解决方案是使用提供.OnEventStart() = 0抽象基类并存储指向该基类的std::vector

std::vector<std::unique_ptr<MyAbstractClass>> handlers;
void OnEventStart(int id)
{
    for(auto& h : handlers)
        h->OnEventStart(id);
}