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

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 に答える