Статический массив указателей методов - PullRequest
1 голос
/ 22 сентября 2011

Я столкнулся с ошибкой, которую не понимаю.

Я пытаюсь создать и использовать статический массив указателей на методы. Объявление в моем классе выглядит так:

static void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);

Инициализация происходит в моих .cpp файлах так:

void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);

Здесь возникают проблемы, в одном из методов класса моего Клиента я пытаюсь использовать массив указателей этих методов. Я пробовал несколько способов, например:

(this->*packetHandler[_opcode])(data);

Я сказал, что не понимаю проблемы, позвольте мне объяснить, почему. Запуск make в моем коде приводит к правильной компиляции, но проблема связана с компоновкой.

client.cpp:71: undefined reference to `Client::packetHandler'

Это сообщение повторяется 5 раз.

Любая помощь будет приветствоваться. Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data); объявляет глобальную переменную с именем packetHandler.Вы хотите определить переменную вашего класса, которая требует дополнительных Client::, например, так:

void (Client::*Client::packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);
0 голосов
/ 23 сентября 2011

Client::*packetHandler - указатель на функцию-член, которая указывает на функцию-член с именем Client::packetHandler. Я не уверен, как сделать указатель на функцию-член, которая указывает на произвольную функцию-член, что, как вы, похоже, хотите сделать. Я думаю, что Джордж прав. Вы должны рассмотреть возможность использования чего-то вроде boost::function или std::tr1::function или написать свой собственный класс-оболочку функции-члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...