2013-01-01 54 views
-1

我認爲這主要是一個語法錯誤調用一個成員函數的函數指針從一個函數指針向量

我試圖開發一種事件驅動型(雖然不是在編譯期間捕捉到,只有在運行時沒有錯誤發生)架構,我保留了eventReceiver的矢量,並嘗試從矢量中調用它們。

CommonIO.h

class CommonIO { 
    public: 
     typedef void (*incomingMsgReceiver)(char*); 
      void registerForIncomingMsg(incomingMsgReceiver); 
      void incomingMsgReceived(char*); 
    } 

CommonIO.cpp

std::vector<void (*)(char*)> listeners; 

    void CommonIO::registerForIncomingMsg(incomingMsgReceiver receiverFunction) { 
     listeners.push_back(receiverFunction); 
    } 

    void CommonIO::incomingMsgReceived(char* buf) { 
     for (unsigned int j = 0; j < listeners.size(); j++) { 
       listeners[i](buf); //error, segmentation fault..how do i call it? 
      } 
    } 

Main.h

class Main { 
public: 
    static void msgReceived(char*); 
    void mainLoop(); 

} 

Main.cpp的

void Main::msgReceived(char* msg) 
{ 
    printf("\n\n --------->>>>> %s \n\n" , msg); 
} 

void Main::mainLoop() 
{ 
    CommonIO::incomingMsgReceiver receiver = &Main::msgReceived; 
    CommonIO::getInstance()->registerForIncomingMsg(receiver); 
} 

incomingMsgReceived功能由一個異步過程

的程序編譯fine..however在分解稱爲:listenersi;線。 這是什麼適當的語法?

+0

我不知道當從不調用該函數時,如何在'CommonIO :: incomingMsgReceived'內部得到分段錯誤。 –

+1

我不相信那是你真正的代碼(什麼是'我'?)。請考慮創建一個[SSCCE](http://sscce.org)。 –

+0

在你的'incomingMsgReceived'中,參數的名字是什麼,'buf'來自哪裏,爲什麼它需要投射? – DCoder

回答

2

爲什麼不使用繼承和通用基類?讓簡單的代碼,你也與對象的細節讓你擁有數據,其他的方法等

即是這樣的

class incomingMsgReceiver { 
    public: 
     virtual void msgReceived(char *msg) = 0; 
}; 

class MyMessage : public incomingMsgReceiver { 
    public virual void msgReceieved(char *msg); 
} 

class OtherMyMessage : public incomingMsgReceiver { 
    public virual void msgReceieved(char *msg); 
} 

void MyMessage::msgReceived(char *msg) 
{ 
    /// Do stuff here 

} 

void msgReceived::OtherMyMessage(char *msg) 
{ 
    /// Do stuff here 

} 

然後你common.h

class CommonIO 
{ 
    private: 
     std::vector<incomingMsgReceiver *> listeners; 
    public: 
     void addListner(incomingMsgReceiver *reveiver) { listners.push_back(reveiver); } 

     void incomingMsgReceived(char*msg) 
     { 
     for (unsigned int j = 0; j < listeners.size(); j++) 
     { 
      listeners[j]->msgReceived((msg); 
     } 
     } 
}; 
+0

錯誤被DCoder正確指出。問題是一個非常愚蠢的索引問題。然而,在我注意到他的回覆之前,我也嘗試了你的建議,這也很好! –

相關問題