Передача указателя производного класса для обратного вызова - PullRequest
0 голосов
/ 12 марта 2012

Я пытаюсь создать драйвер последовательного RX на основе обратного вызова и получаю ошибку компиляции, несмотря на то, что я использую структуру, которая хорошо известна и проверена в других приложениях. Я уверен, что я делаю что-то глупое, но для жизни я не вижу этого, так что несколько дополнительных пар глаз будет высоко оценено.

Устройство должно функционировать следующим образом:

  1. На строительство, передать в свойствах связи
  2. Для синхронной связи не создавайте новый поток, просто заблокируйте на TX.
  3. Для получения данных создайте новый поток и выполните обратный вызов, переданный пользователем на RX.

Для реализации этого у меня есть базовый класс обратного вызова:

namespace ocular
{
 Class DeviceCallback
 {
 public:
   DeviceCallback(){}
   ~DeviceCallback(){}
   virtual void DeviceCallbackFunction(unsigned char Data){}
 };
}

И метод Start Asynch RX внутри самого класса устройства как:

void DeviceClass::StartAsynchRX( DeviceCallback* callback )
{
  m_externalCallback = callback; // Save a local copy of the callback pointer
  m_started = true;
  StartAsynchRXThread();         // Spawn the RX Thread
  return;
}

Затем я получаю свой собственный обратный вызов как:

Class DemoCallbackClass : public ocular::DeviceCallback
{
public:
  void DeviceCallbackFunction(unsigned char myData){
    std::cout << myData;
  };
}

Насколько я могу судить, до сих пор это учебник правильный. Это прекрасно скомпилируется, и я могу создавать, настраивать и использовать класс моего устройства для синхронной передачи. Ошибка компиляции появляется, когда я пытаюсь фактически передать указатель обратного вызова в main:

void main(void)
{
  DeviceClass MyDevice();
  MyDevice.Initialise( *settings from file* );

  DemoCallbackClass MyDemoCallback();

  MyDevice.StartAsynchRX( &MyDemoCallback );  // ERROR ON THIS LINE
}

1> ...... \ Src \ Support \ AR2500 Пуск в эксплуатацию \ Main.cpp (99): ошибка C2664: «ocular :: DeviceClass :: StartAsynchRX»: невозможно преобразовать параметр 1 из «DemoCallbackClass (__cdecl *)» (void) 'to' ocular :: DeviceCallback * '

Я вполне уверен, что сделал здесь что-то глупое, но я не могу найти это для своей жизни. На прошлой неделе я написал класс таймера событий, используя тот же подход, и он работает просто отлично. Если структура / подход выглядит нормально для всех, я полагаю, это неуловимая опечатка, и мне просто нужно переписывать порцию за раз, пока я не избавлюсь от этой чертовой ошибки.

Ваш в отчаянии,

DKW

1 Ответ

0 голосов
/ 12 марта 2012

Удалите скобки из этой строки:

DemoCallbackClass MyDemoCallback();

Так это выглядит так:

DemoCallbackClass MyDemoCallback;

Вывод ошибки в этом случае не поможет, но это должно исправить.

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