久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

使用類(lèi)成員的 C++ 回調(diào)

C++ callback using class member(使用類(lèi)成員的 C++ 回調(diào))
本文介紹了使用類(lèi)成員的 C++ 回調(diào)的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我知道這個(gè)問(wèn)題已經(jīng)被問(wèn)過(guò)很多次了,正因?yàn)槿绱耍液茈y深入挖掘這些問(wèn)題并找到一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明什么是有效的.

I know this has been asked so many times, and because of that it's difficult to dig through the cruft and find a simple example of what works.

我知道了,它很簡(jiǎn)單,適用于 MyClass...

I've got this, it's simple and it works for MyClass...

#include <iostream>
using std::cout;
using std::endl;

class MyClass
{
    public:
        MyClass();
        static void Callback(MyClass* instance, int x);
    private:
        int private_x;
};

class EventHandler
{
    public:
        void addHandler(MyClass* owner)
        {
            cout << "Handler added..." << endl;
            //Let's pretend an event just occured
            owner->Callback(owner,1);
        }
};

EventHandler* handler;

MyClass::MyClass()
{
    private_x = 5;
    handler->addHandler(this);
}

void MyClass::Callback(MyClass* instance, int x)
{
    cout << x + instance->private_x << endl;
}

int main(int argc, char** argv)
{
    handler = new EventHandler();
    MyClass* myClass = new MyClass();
}

class YourClass
{
    public:
        YourClass();
        static void Callback(YourClass* instance, int x);
};

如何重寫(xiě),以便 EventHandler::addHandler() 可以與 MyClassYourClass 一起使用.我很抱歉,但這只是我大腦的工作方式,我需要先看看一個(gè)簡(jiǎn)單的例子,然后才能理解它為什么/如何工作.如果您有最喜歡的方法來(lái)完成這項(xiàng)工作,現(xiàn)在是時(shí)候展示它了,請(qǐng)標(biāo)記該代碼并將其發(fā)回.

How can that be rewritten so EventHandler::addHandler() will work with both MyClass and YourClass. I'm sorry but it's just the way my brain works, I need to see a simple example of what works before I can comprehend why/how it works. If you've got a favorite way to make this work now's the time to show it off, please markup that code and post it back.

有人回答了,但在我打勾之前答案就被刪除了.就我而言,答案是模板化函數(shù).將 addHandler 更改為此...

It was answered but the answer was deleted before I could give the checkmark. The answer in my case was a templated function. Changed addHandler to this...

class EventHandler
{
    public:
        template<typename T>
        void addHandler(T* owner)
        {
            cout << "Handler added..." << endl;
            //Let's pretend an event just occured
            owner->Callback(owner,1);
        }
};

推薦答案

您可以使用新的 C++11 標(biāo)準(zhǔn)中的功能,而不是使用靜態(tài)方法和傳遞指向類(lèi)實(shí)例的指針:std::functionstd::bind:

Instead of having static methods and passing around a pointer to the class instance, you could use functionality in the new C++11 standard: std::function and std::bind:

#include <functional>
class EventHandler
{
    public:
        void addHandler(std::function<void(int)> callback)
        {
            cout << "Handler added..." << endl;
            // Let's pretend an event just occured
            callback(1);
        }
};

addHandler 方法現(xiàn)在接受一個(gè) std::function 參數(shù),并且這個(gè)函數(shù)對(duì)象"沒(méi)有返回值并且接受一個(gè)整數(shù)作為參數(shù).

The addHandler method now accepts a std::function argument, and this "function object" have no return value and takes an integer as argument.

要將其綁定到特定函數(shù),請(qǐng)使用 std::bind:

To bind it to a specific function, you use std::bind:

class MyClass
{
    public:
        MyClass();

        // Note: No longer marked `static`, and only takes the actual argument
        void Callback(int x);
    private:
        int private_x;
};

MyClass::MyClass()
{
    using namespace std::placeholders; // for `_1`

    private_x = 5;
    handler->addHandler(std::bind(&MyClass::Callback, this, _1));
}

void MyClass::Callback(int x)
{
    // No longer needs an explicit `instance` argument,
    // as `this` is set up properly
    cout << x + private_x << endl;
}

您需要在添加處理程序時(shí)使用 std::bind,因?yàn)槟枰鞔_指定其他隱式的 this 指針作為參數(shù).如果你有一個(gè)獨(dú)立的函數(shù),你就不必使用 std::bind:

You need to use std::bind when adding the handler, as you explicitly needs to specify the otherwise implicit this pointer as an argument. If you have a free-standing function, you don't have to use std::bind:

void freeStandingCallback(int x)
{
    // ...
}

int main()
{
    // ...
    handler->addHandler(freeStandingCallback);
}

讓事件處理程序使用 std::function 對(duì)象,還可以使用新的 C++11 lambda 函數(shù):

Having the event handler use std::function objects, also makes it possible to use the new C++11 lambda functions:

handler->addHandler([](int x) { std::cout << "x is " << x << '
'; });

這篇關(guān)于使用類(lèi)成員的 C++ 回調(diào)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫(xiě) for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: 日韩成人在线播放 | 97人人澡人人爽91综合色 | 亚洲激情网站 | 99热碰 | 亚州精品天堂中文字幕 | 暖暖日本在线视频 | 久久国产日本 | 男人的天堂久久 | 国产精品久久久久久网站 | 国产91在线播放精品91 | 国产成人精品免高潮在线观看 | 成人av播放 | 亚洲激情一区二区三区 | 在线免费观看亚洲 | 日本成人久久 | 亚洲九九 | 精品久久久久久久 | 国产精品a免费一区久久电影 | 国内精品久久精品 | 日韩在线中文字幕 | 91精品久久久久久综合五月天 | 91精品国产91久久久久久吃药 | 国产精品视频导航 | 国产精品福利网站 | 欧美日韩一区精品 | 日韩日韩日韩日韩日韩日韩日韩 | 国产精品久久久久久久免费观看 | 国产激情精品一区二区三区 | 国产毛片久久久久久久久春天 | 伊人网在线播放 | 欧美一区二区三区免费在线观看 | 亚洲视频区 | 一区二区三区久久久 | 欧美一级免费看 | 欧美国产日韩在线观看成人 | 亚洲国产一区二区视频 | 亚洲一区二区三区四区视频 | 91精品国产一区二区三区 | 国产日产久久高清欧美一区 | 久久久久国产精品 | 国产精品久久久久永久免费观看 |