【问题标题】:How to make listener accessible for other functions in C++?如何使 C++ 中的其他函数可以访问侦听器?
【发布时间】:2017-04-27 11:06:12
【问题描述】:

我想让我的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]

【问题讨论】:

    标签: c++ kinect libfreenect2


    【解决方案1】:

    观察:

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

    会导致编译错误。当您尝试使用标志调用listener()(int) operator 时,显然listener 对象没有为它定义()(int) operator

    这样的错误信息:

    不匹配调用‘(libfreenect2::SyncMultiFrameListener) (int)

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

    只浏览libfreenect2::SyncMultiFrameListenersource 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();
    

    您可以在 Constructor

    下阅读更多关于 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)
    {
        ...
    }
    

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

    【讨论】:

    • 您的“修复”不起作用,但您的“由构造函数”修复了它。谢谢!
    • 是的,刚刚发现“修复”不起作用,因为没有可用的默认构造函数。如果您想以原始方式编写代码,则必须通过带有“new”的指针来完成。我已经更新了示例以供参考。虽然我不推荐它,除非有一个强大的用例,因为它容易出错。
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2018-01-21
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多