вызывающий указатель на функцию-член из вектора указателя на функцию

я думаю, что это в основном синтаксическая ошибка (хотя она не фиксируется во время компиляции, только во время выполнения возникает ошибка)

я пытаюсь разработать управляемую событиями архитектуру, в которой я сохраняю вектор 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 );
}

ФункцияcomingMsgReceived вызывается асинхронным процессом

программа компилируется нормально .. но все же ломается в: listenersi; линия.
Каков правильный синтаксис для этого?

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector