c++ - 如何让 C++ 中的其他函数可以访问监听器?

标签 c++ kinect libfreenect2

我想让我的 getFrames() 函数可以访问以下监听器。我怎样才能做到这一点?我通过将监听器添加到我的私有(private)字段来尝试这样做,但我仍然在 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) 运算符 时,显然 listener 对象没有 ( )(int) 运算符 为其定义。

这样的错误信息:

no match for call to ‘(libfreenect2::SyncMultiFrameListener) (int)

您在这里所做的是尝试使用这些标志构建监听器。您只能在类的构造函数中执行该表达式,除非 libfreenect2::SyncMultiFrameListener 具有用于该目的的 operator()。

只是浏览source code 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();

您可以在 here 上阅读更多内容在构造函数

有几种方法可以解决这个问题:

在表达式中初始化

进行以下更改:

标题:

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)
{
    ...
}

为了安全起见,使用构造函数示例可能会更好,但这取决于您的用例。

关于c++ - 如何让 C++ 中的其他函数可以访问监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41103287/

相关文章:

C++ MPI_Bcast 类

c++ - `decltype(auto)` 变量是否有任何实际用例?

c# - 使用 Microsoft Kinect 跟踪 Blob

c# - 是否可以使用 StreamWriter c# 水平附加文本?

通过处理控制 Kinect 电机

Java:运行处理 3.2.1 的 Raspberry Pi 上出现不满足的链接错误

c++ - 输出前删除匹配字符

c++ - 我可以在 C++ 接口(interface)(抽象类)中包含什么

python - 矢量化 Kinect 真实世界坐标处理算法以提高速度

C++ Kinect v2 & freenect2 : how to convert depth data to real world coordinates