Как сделать слушателя доступным для других функций в C++?

Я хочу сделать следующего слушателя доступным для моего getFrames() функция. Как я могу это сделать? Я попытался это, добавив прослушиватель в мои личные поля, но я по-прежнему получаю следующую ошибку listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);:

нет соответствия для вызова '(libfreenect2::SyncMultiFrameListener) (int)

Пожалуйста, посмотрите на пример кода приложения

Исходный файл:

int KinectConnector::connect() {
    //! [listeners]
    listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);

    dev->setColorFrameListener(&listener);
    dev->setIrAndDepthFrameListener(&listener);     
}

void KinectConnector::getFrames() {
    while (!protonect_shutdown) {
        listener.waitForNewFrame(frames);
    }
}

Заголовочный файл:

class KinectConnector {
public:
    KinectConnector();
    virtual ~KinectConnector();
    int connect();
    void getFrames();
private:
    libfreenect2::SyncMultiFrameListener listener
    libfreenect2::FrameMap frames;
};

Пример приложения от github:

/// [listeners]
  int types = 0;
  if (enable_rgb)
    types |= libfreenect2::Frame::Color;
  if (enable_depth)
    types |= libfreenect2::Frame::Ir | libfreenect2::Frame::Depth;
  libfreenect2::SyncMultiFrameListener listener(types);
  libfreenect2::FrameMap frames;

  dev->setColorFrameListener(&listener);
  dev->setIrAndDepthFrameListener(&listener);
/// [listeners]

1 ответ

Решение

Из наблюдения:

listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);

Вызовет ошибку компиляции. Как вы пытаетесь позвонить ()(int) operator из listener с флагами и, видимо, listener объект не имеет ()(int) operator определено для этого.

Как таковое сообщение об ошибке:

нет соответствия для вызова '(libfreenect2::SyncMultiFrameListener) (int)

Здесь вы пытаетесь создать слушатель с этими флагами. Вы можете сделать это выражение только в конструкторе класса, если libfreenect2::SyncMultiFrameListener имеет оператор () для этой цели.

Просто просматривая исходный код libfreenect2::SyncMultiFrameListener Нет доступного конструктора по умолчанию. Это означает, что вам нужно предоставить флаги при инициализации или создании.

разница

Обратите внимание на разницу между этими двумя кодами:

// listener declared with types as shown in Github Example
// calls the libfreenect2::SyncMultiFrameListener(int) constructor
libfreenect2::SyncMultiFrameListener listener(types);

// Essentially what your code does is this, 
// when you declare in the header file without initializing in the constructor
// calls the libfreenect2::SyncMultiFrameListener() constructor which don't exists
libfreenect2::SyncMultiFrameListener listener2();

Вы можете прочитать больше здесь под Конструктором

Есть несколько способов решить эту проблему:

Инициализация в выражении

Сделайте следующие изменения:

Заголовок:

class KinnectConnector
{
    ...
private:
    libfreenect2::SyncMultiFrameListener* listener;
    ...
};

Источник:

int KinectConnector::connect() {
    listener = new libfreenect2::SyncMultiFrameListener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
    ...
}

* Не забудьте удалить после использования с delete listener; в деструкторе или где-то еще.

Инициализация в конструкторе

Для инициализации сделайте следующее listener когда KinnectConnector построен

KinectConnector::KinectConnector()
: listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir)
{
    ...
}

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

Другие вопросы по тегам