2017-01-24 117 views
-1

在我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

我假设你想要使用的框架/ SDK直接调用你的成员函数?然后它取决于您正在使用的实际框架/ SDK的许多*。这可能不可能。但除非您告诉我们框架/ SDK以及如何使用它(使用[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)),否则我们无法告诉您。另请[请阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。 –

+2

恕我直言,如果你告诉我们你是如何做的话,这将有助于理解这个问题,而不仅仅是你不想做什么 – user463035818

回答

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); 
} 
+0

感谢您的回复。对不起,问题不清楚,我在你的帖子的第二部分提到了你遇到的问题。这种方法是否会要求我实例化每个类(其中会有很多),然后对每个类继续执行'handlers.push_back(class)'? – thefatshizms

+0

@thefatshizms:你可以用很多不同的方式做到这一点。如果您在编译时知道所有类型,则可以使用元编程库和编译时间列表。如果你允许你的代码的用户添加更多的类型来满足界面,你需要做你提到的,也许提供某种'register ()'函数。 –