2

C\C++ 是否支持回调函数机制?以及如何创建它?我已经编写了几个代码,在 C++ 中创建回调函数,但它失败了..

    #include<iostream>
    using namespace std;

    void callee()
    {
         printf("callee\n"); 
         printf("calleeeeeeeeee\n"); 
    }

    void callback(void* func)
    {
         printf("callback\n");     
    }

    int main()
    {
        void (*call)(void*);
        void (*call2)(void);
        call2 = &callee;
        call = &callback;
        call((void*)call2);    
        getchar();
        return 0;    
    }
4

3 回答 3

9

我不懂C++,我写了一些C代码,希望对你有帮助

#include <stdio.h>

void call( int, void ( *f )( int ) );
void called( int );

int main( int argc, char const *argv[] ){
    printf( "start\n" );
    call( 1, called );
    printf( "end\n" );
    getchar();
    return 0;
}

void call( int a, void ( *f )( int ) ){
    printf( "doing stuff\n" );
    printf( "a: %d\n", a );
    printf( "going to call back\n" );
    f( a * 2 );
}

void called( int b ){
    printf( "b: %d\n", b );
    printf( "b*2: %d\n", b*2 );
    printf( "call back function being called\n" );
}

在函数中调用回调函数只不过是拥有一个函数指针,并在您完成计划的工作时调用该函数。

我修改了代码并使它更清楚地展示了你将如何使用回调。
如果您编译并运行它,您将看到以下结果:

start
doing stuff
a: 1
going to call back
b: 2
b*2: 4
call back function being called
end

好吧,要么作者编辑了问题,要么有人为他编辑了问题,不再有 C 标签。如果您不想看到纯 C 代码,请忽略此答案。我只是把它留在这里,以防有人感兴趣。

于 2013-02-24T07:29:03.753 回答
2

好吧,你从来没有调用过“callee”——你用“call(void*)call2);”执行了“callback”,但是为了让你的“callee”函数执行,你需要在你的“callback”函数中运行它. 在这里,这有效:

#include <iostream>
#include <stdio.h>
using namespace std;

void callee()
{
     printf("callee\n");
     printf("calleeeeeeeeee\n");
}

void callback(void* func)
{
    void (*mCallbackFunc)(void);

    printf("callback\n");

    mCallbackFunc = (void(*)())func;
    mCallbackFunc();
}

int main()
{
    void (*call)(void*);
    void (*call2)(void);
    call2 = &callee;
    call = &callback;

    call((void*)call2);

    return 0;
}

输出:

callback
callee
calleeeeeeeeee
于 2013-02-24T07:34:53.870 回答
0

这是一个使用接口回调的例子。

//listener observer design pattern
class MonitoringElements{
public:

//information to monitor

};

class ICondition{
public:
    virtual ~ICondition(){}

    virtual bool didTrigger(const MonitoringElements& current) = 0;
    virtual void risingEdge() = 0;
};

class MonitorManager final{
public:


    void addCondition(ICondition* condition){
        m_conditions.push_back(condition);
    }

    //constantly monitoring every x seconds
    void monitorOnce(){
        update();
        for(int i = 0; i < m_conditions.size(); ++i)
            if(m_conditions.at(i)->didTrigger(m_monitorElements)){
                m_conditions.at(i)->risingEdge();
            }
    }

private:
    void update(){
        //read sensor values here
        //update m_monitorElements;
    }

    MonitoringElements m_monitorElements;
    std::vector<ICondition*> m_conditions;
};
于 2017-04-08T06:55:26.973 回答