2013-10-16 92 views
1

我已經問過我的問題,現在我在下一步。在下面的代碼中,我遇到了這個問題,我總是必須使EventHandler(Server :: HandleMessage)靜態。但我需要讓它不是靜態的,以便在Handler中訪問服務器類中的其他變量。C++事件處理 - 問題與const

我該如何做到這一點?

這裏我的代碼:

#include <iostream> 
#include <functional> 

using namespace std; 

class Client{ 
    public: 
     struct MessageReceiveArgs { 
      MessageReceiveArgs(int ID, const std::string& Text) : ID(ID), Text(Text) {} 
      int ID; 
      std::string Text; 
     }; 

     std::function<void(MessageReceiveArgs)> onMessageReceive; 
     Client(){} 

     void FireEvent(){ 
      this->onMessageReceive(MessageReceiveArgs(16, "SomeText")); 
     } 
}; 

class Server{ 
    public: 
     int i; 

     Server(){ 
      this->client.onMessageReceive = &Server::HandleMessage; 
      this->i = 5; 
     } 

     void FireEvent(){ 
      this->client.FireEvent(); 
     } 

     Client client; 

     static void HandleMessage(Client::MessageReceiveArgs args) { 
      std::cout<<"ID "<<args.ID<<": "<<" "<<args.Text<<std::endl; 

      //need it non static 
      //std::cout<<"I: "<<this->i<<std::endl; 
     } 
}; 

int main() { 
    Server sv = Server(); 
    sv.FireEvent(); 
} 

正如我以前的文章中提到,我是新來的標準C++(UNIX)。

+1

注:保存自己的副本,構造函數;將'Text'作爲'const std :: string&'傳遞給'MessageReceiveArgs'。而這個:'this-> client = Client();'是沒用的。當你到達這個代碼時,'client'成員已經是默認構造的。這不是Java或C#。 – WhozCraig

+0

已經改變,謝謝,但這並不能解決我的首發問題,你有一個想法嗎? –

+1

是的,其實我是。你需要一個ptr-to-member和一個'this'作爲客戶端初始化或綁定函數的一部分;要麼會工作。老派前者,新派後者。除非有人在我之前到達那裏,否則我會試着寫點東西。 – WhozCraig

回答

2

我相當確定這是你所追求的。您需要在以您似乎期望的方式通過std::function調用指向成員的指針時明確地綁定隱含的this

#include <iostream> 
#include <functional> 

using namespace std; 

class Client{ 
public: 

    struct MessageReceiveArgs 
    { 
     MessageReceiveArgs(int ID, const std::string& Text) 
      : ID(ID), Text(Text) {} 
     int ID; 
     std::string Text; 
    }; 

    Client(){} 

    void FireEvent() 
    { 
     this->onMessageReceive(MessageReceiveArgs(16, "SomeText")); 
    } 

    std::function<void(MessageReceiveArgs)> onMessageReceive; 
}; 



class Server 
{ 
public: 
    int i; 

    Server() 
    { 
     this->client.onMessageReceive 
      = std::bind(&Server::HandleMessage, this, std::placeholders::_1); 
     this->i = 5; 
    } 

    void FireEvent() 
    { 
     this->client.FireEvent(); 
    } 

    Client client; 

    void HandleMessage(Client::MessageReceiveArgs args) 
    { 
     std::cout<<"ID "<<args.ID<<": "<<" "<<args.Text<<std::endl; 
    } 
}; 

int main() 
{ 
    Server sv = Server(); 
    sv.FireEvent(); 
} 

輸出

ID 16: SomeText 
+0

Yiep,這正是我想要實現的,謝謝! –