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

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

нет соответствия для вызова to (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]

3

Решение

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

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

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

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

нет соответствия для вызова to (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)
{
...
}

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

3

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

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

По вопросам рекламы [email protected]