3

関数で次のリスナーにアクセスできるようにしたいと考えてい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]
4

1 に答える 1

3

観察から:

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

コンパイルエラーになります。フラグを使用して()(int) operatorofを呼び出そうとしているため、オブジェクトが定義されていないようです。listenerlistener()(int) operator

そのようなエラーメッセージ:

'(libfreenect2::SyncMultiFrameListener) (int) の呼び出しに一致しません

ここで行っているのは、これらのフラグを使用してリスナーを構築しようとしています。libfreenect2::SyncMultiFrameListenerその目的のための operator() がない限り、クラスのコンストラクターでのみその式を実行できます。

のソース コードを閲覧しただけではlibfreenect2::SyncMultiFrameListener、使用できるデフォルトのコンストラクタはありません。つまり、初期化または構築時にフラグを指定する必要があります。

違い

これら 2 つのコードの違いに注意してください。

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

安全のために、コンストラクターの例を使用する方が良いかもしれませんが、それはユースケースによって異なります。

于 2016-12-15T01:33:24.203 に答える