【问题标题】:calling function pointer of a member function from a function pointer vector [closed]从函数指针向量调用成员函数的函数指针
【发布时间】:2012-12-16 05:32:30
【问题描述】:

我认为这主要是语法错误(虽然在编译期间没有捕获,但只有在运行时才会发生错误)

我正在尝试开发一个事件驱动架构,我在其中保留一个 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 函数被异步进程调用

程序编译得很好..但是在:listenersi;线。 什么是正确的语法?

【问题讨论】:

  • 我不知道当这个函数从不被调用时,你如何在CommonIO::incomingMsgReceived 中得到一个分段错误。
  • 我不相信那是你真正的代码(i 是什么?)。请考虑创建SSCCE
  • 在您的incomingMsgReceived 中,参数的名称是什么,buf 来自哪里,为什么需要强制转换?
  • 什么是buf?还是我呢?
  • 嗨,你们是对的..这是一个相当大的程序的一部分..很难将整个内容粘贴到这里。但是,为了更好地理解,我对代码进行了一些编辑。 -incomingMsgReceived 被另一个进程异步调用。 - buf 是接收到的要传递的消息,但是,所有这些都有效,除了对 listeners[i](buf) 的调用;这是我没有使用正确语法的地方(很可能)。

标签: c++ vector function-pointers event-driven-design


【解决方案1】:

为什么不使用继承和公共基类?编写更简单的代码,并且您可以使用对象进行详细说明,以便您拥有数据、其他方法等。

即像这样的

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);
         }
      }
};

【讨论】:

  • DCoder 正确指出了错误。问题是一个非常愚蠢的索引问题。但是,在我注意到他的回复之前..我也尝试了你的建议,这也很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多