Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从派生类隐式调用函数_C++_C++11_C++14_Software Design - Fatal编程技术网

C++ 从派生类隐式调用函数

C++ 从派生类隐式调用函数,c++,c++11,c++14,software-design,C++,C++11,C++14,Software Design,在my 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 }

在my 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);
}

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

你的问题不是很清楚,但我假设如下:

void OnEventStart(int id)
{
    // Do some stuff
}
  • 您有某种回调处理程序,它接受
    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);
}
std::向量处理程序;
void OnEventStart(int-id)
{
用于(自动和h:处理程序)
h->OnEventStart(id);
}

我假设您希望使用框架/SDK直接调用您的成员函数?那么这在很大程度上取决于您使用的实际框架/SDK。这甚至可能是不可能的。但是我们不能告诉您,除非您告诉我们框架/SDK以及如何使用它(使用a)。还有,我想如果你告诉我们你想怎么做,而不仅仅是你不想怎么做,这将有助于理解这个问题谢谢你的回答。很抱歉,问题不清楚,我在你文章的第二部分提到了这个问题。这个方法不需要我实例化每个类(将有很多)然后继续处理
处理程序。为每个类向后推(类)
。@thefatshizms:你可以用很多不同的方法来做这件事。如果您知道编译时的所有类型,那么可以使用元编程库和编译时列表。如果您允许代码用户添加更多满足接口要求的类型,则需要执行您提到的操作,可能需要提供某种类型的
register()
函数。