Как сделать слушателя доступным для других функций в 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)
{
...
}
В целях безопасности может быть лучше пойти с примером конструктора, но это зависит от вашего варианта использования.