Ошибка при ответном вызове: недопустимое использование нестатического члена данных - PullRequest
0 голосов
/ 20 ноября 2018

РЕДАКТИРОВАТЬ: Обновленный чистый воспроизводимый пример.

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

У меня две проблемы:

a) У меня нетэкземпляр Range в Callback и обратный вызов не имеет для меня параметра void *.

b) Я получаю сообщение об ошибке

ошибка: недействительноиспользование нестатического члена данных 'Range :: cbk'

Я только начинаю изучать C ++ и правила ООП, поэтому извиняюсь, если я делаю вещи, которые в корне ошибочны.

#include <iostream>
#include <functional>

class Range
{
public:
  typedef std::function<void()> TCallback;
  TCallback cbk;

  Range()
  {
    cbk = std::bind(&Range::RunTest, this);
  }

  void Close() {}

  ~Range() { Close(); }

  void RunTest()
  {
        std::cout << "RunningTest\n";
  }
};

static void Callback(bool ev)
{
  if (ev)
    Range::cbk();
}


int main()
{
  std::function<void(bool)> test;
    Range r1;
  test = std::bind(Callback, 1);
  test(1);

  return 0;
}

1 Ответ

0 голосов
/ 21 ноября 2018

Вы не можете вызвать функцию-член без экземпляра.

Вы сделали это правильно в конструкторе Range; Вы сделали это неправильно в main и Callback.

static void Callback(Range* ptr, bool ev)
{
  if (ev)
    ptr->cbk();
}

И

test = std::bind(Callback, &r1, 1);
//                       ^^^^^

Если вы не можете изменить Callback, то то, что вы хотите сделать, просто невозможно. Вы должны иметь какой-нибудь глобальный Range указатель, но это действительно смешивается. В конечном счете, именно поэтому классы были изобретены, но если вы не можете их использовать, потому что застряли с действительно плоским C-API, вам просто нужно взломать его, как в C.

...