如何让 C++ 中的其他函数可以访问侦听器?
How to make listener accessible for other functions in C++?
我想让我的 getFrames()
函数可以访问以下侦听器。我怎样才能做到这一点?我通过将侦听器添加到我的私有字段来尝试此操作,但我仍然在 listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
上收到以下错误:
no match for call 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]
来自观察:
listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
会导致编译错误。当您尝试使用标志调用 listener
的 ()(int) operator
时,显然 listener
object 没有为其定义 ()(int) operator
。
因此错误信息:
no match for call to ‘(libfreenect2::SyncMultiFrameListener) (int)
您在这里所做的是尝试使用这些标志构建侦听器。您只能在 class 的构造函数中执行该表达式,除非 libfreenect2::SyncMultiFrameListener
具有用于此目的的 operator()。
只是浏览libfreenect2::SyncMultiFrameListener
的source code,没有可用的默认构造函数。这意味着您需要在初始化或构造时提供标志。
差异
注意这两个代码之间的区别:
// 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();
您可以在 构造函数
下阅读有关 here 的更多信息
您可以通过多种方式解决此问题:
正在表达式中初始化
进行以下更改:
Header:
class KinnectConnector
{
...
private:
libfreenect2::SyncMultiFrameListener* listener;
...
};
来源:
int KinectConnector::connect() {
listener = new libfreenect2::SyncMultiFrameListener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
...
}
*记得在析构函数或其他地方使用 delete listener;
后删除。
正在构造函数中初始化
构造KinnectConnector
时执行以下操作初始化listener
KinectConnector::KinectConnector()
: listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir)
{
...
}
为了安全起见,最好使用构造函数示例,但这取决于您的用例。
我想让我的 getFrames()
函数可以访问以下侦听器。我怎样才能做到这一点?我通过将侦听器添加到我的私有字段来尝试此操作,但我仍然在 listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
上收到以下错误:
no match for call 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]
来自观察:
listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
会导致编译错误。当您尝试使用标志调用 listener
的 ()(int) operator
时,显然 listener
object 没有为其定义 ()(int) operator
。
因此错误信息:
no match for call to ‘(libfreenect2::SyncMultiFrameListener) (int)
您在这里所做的是尝试使用这些标志构建侦听器。您只能在 class 的构造函数中执行该表达式,除非 libfreenect2::SyncMultiFrameListener
具有用于此目的的 operator()。
只是浏览libfreenect2::SyncMultiFrameListener
的source code,没有可用的默认构造函数。这意味着您需要在初始化或构造时提供标志。
差异
注意这两个代码之间的区别:
// 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();
您可以在 构造函数
下阅读有关 here 的更多信息您可以通过多种方式解决此问题:
正在表达式中初始化
进行以下更改:
Header:
class KinnectConnector
{
...
private:
libfreenect2::SyncMultiFrameListener* listener;
...
};
来源:
int KinectConnector::connect() {
listener = new libfreenect2::SyncMultiFrameListener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
...
}
*记得在析构函数或其他地方使用 delete listener;
后删除。
正在构造函数中初始化
构造KinnectConnector
时执行以下操作初始化listener
KinectConnector::KinectConnector()
: listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir)
{
...
}
为了安全起见,最好使用构造函数示例,但这取决于您的用例。