[Kinectプログラミング]C++でクラス化

このQ&Aのポイント
  • OpenNI+NITEとOpenCVの環境でC++を使ってKinectプログラミングに取り組んでいます。
  • キネクトハッカーズマニュアルのソースコードをクラス化しようとしていますが、エラーが発生しています。
  • XnCallbackHandle swipeRightCallback = swipeDetector.RegisterSwipeRight((void*)"Right", CallBacks::Swipe); というコードでエラーが発生しています。
回答を見る
  • ベストアンサー

[Kinectプログラミング]C++でクラス化

OpenNI+NITEとOpenCVの環境で、 C++を使ってKinectプログラミングに取り組んでいます。 Visual C++を使っています。 キネクトハッカーズマニュアルという書籍を使っているのですが、 その中のソースコードは全て一つのクラスファイルに記述されているので、 これをクラス化出来ないものかと試行錯誤しています。 http://hagino3000.github.com/kinectbook/ こちらのサイトにソースコードが公開されています。 これの、8_1_detect_gestureというものです。 おおまかな構成は、 コールバック関数の宣言が前半になされていて、 後半にmain関数の処理が書いてある、 といった感じなんですが、 このコールバックに関する記述を、 CallBacks.cppというファイルを作って、 そっちにとりあえず全てコピペしてみました。 そしてCallBacks.hも作成して、 例えばスワイプ検出時のコールバックに関しては、 void XN_CALLBACK_TYPE Swipe (XnFloat fVelocity, XnFloat fAngle, void *pUserCxt); とプロトタイプ宣言を記述しました。 ところが、 main関数内で実際にコールバックを呼び出している部分で、 XnCallbackHandle swipeRightCallback = swipeDetector.RegisterSwipeRight((void*)"Right", Swipe); ともともと書かれていたところを XnCallbackHandle swipeRightCallback = swipeDetector.RegisterSwipeRight((void*)"Right", CallBacks::Swipe); と書き換えただけでは、 型"void(_stdcall CallBacks::*)(XnFloat fVelocity, XnFloat fAngle, void *pUserCxt)"の引数は、 型"XnSwipeDetector::SwipeCB"のパラメーターとの互換性が有りません。 というエラーになります。 そこでSwipeCBについて調べてみると、 http://eris.liralab.it/chris/dox/html/classXnVSwipeDetector.html このページなどに記述がありますが、 SwipeCBの引数は(XnFloat fVelocity, XnFloat fAngle, void *pUserCxt)そのものなのです。 変換がうまく行っていないということだとおもうのですが、 どうすれば良いのでしょうか? かなり限定的な質問になってしまって申し訳ありません。 なにか至らない点ありましたらご指摘ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「static でないメンバ関数」は「ふつ~の関数」とは違います.

関連するQ&A

  • c++,ある関数のクラスから別のクラスの関数を呼ぶ

    c++で、あるクラスのメンバ関数から、別のクラスのメンバ関すを呼びたいのですが、どのようにしたらできますか? 例えば、以下のような単純なコードを考えています。やりたいことは、Aのメンバ関数であるaaa()からBのクラスであるbbb()を呼びたいと思っています。その理由を少し説明します。ここでは、Aというクラスとmain関数はオープンソースコードを例えています。できるだけ、元のオープンソースコードを書き換えずに新たな機能を拡張したいと思っています。そこで、Bというクラスを使って、元のオープンソースコードに機能を拡張しようとしています。このような理由なので、bbb()という関数はaaa()という関数から呼びたいです。メイン関数には何も書き加えないのがベストです。 現状では、実行すると「this is aaa」という出力しか出ません。ここに「this is bbb」の出力を加えたいです。クラスAとBにある程度コマンドを追加して、解決できないでしょうか。 #include <iostream> using namespace std; //------------------------------------------------------ class A{ public: void aaa(); virtual void bbb(){} }; //------------------------------------------------------ //------------------------------------------------------ class B : public A{ public: void bbb(); }; //------------------------------------------------------ //------------------------------------------------------ void A::aaa() { cout << "this is aaa \n"; bbb(); } //------------------------------------------------------ //------------------------------------------------------ void B::bbb() { cout << "this is bbb \n"; } //------------------------------------------------------ //------------------------------------------------------ int main() { A a; a.aaa(); return 0; } //------------------------------------------------------

  • 引数について質問

    私プログラミング初心者ですので、できるだけ優しい解説をしていただければ幸いです! 引数について、以下のような解説がありました。 「引数には仮引数と実引数の2種類が存在する。仮引数は、関数を定義する際に変数で指定する引数である。また、実引数は、プログラムの実行時に関数に引き渡される値となる引数である。つまり、関数の実行時には、実引数の値が仮引数に代入されることになる。」 質問:1「関数を定義する際に変数で指定する引数である。」という記述の中で「関数を定義」とありますが、実際のソースコードにおいて何に対応するかわかりません。簡潔なソースコードを交えて解説していただければ幸いです。 質問2:「関数を定義」に限らず、プログラミングにおいて「定義」という言葉をよく見ますが、これは本質的にどういう意味をもっているのでしょうか?具体的なソースコースコードを交えて解説してくださると幸いです。 もしかして、その定義とは例えば「public static void main(String arg[]){」のような「メソッド宣言」のことですか? 質問3:「関数の実行時には、実引数の値が仮引数に代入されることになる。」と書いてありますが、 これはどういうことですか、僕が実際にソースコードで記述してみるので、その考えが正しいか判定してください package 第4章; public class A { public static void main(String arg[]){ double x; x=Math.sqrt(2.0); System.out.println("2.0の平方根は"+x); } } 僕の考え:String arg[]が仮引数で、実引数2.0がString arg[]に代入されるってことでしょうか? 「定義」といえば、上記のソースコードでは、public static void main(String arg[]){ 以外見当たらないので、、 僕の考え2:Mathクラスは、標準クラス(javaが最初から備えているクラス)だから、プログラマが「関数を定義」しなくても予め関数が定義されているから、関数を定義する必要がない、ということでしょうか?

    • ベストアンサー
    • Java
  • プログラミングをはじめたばかりでわかりません

    宣言されたクラスをmainなどで配列で呼び出すときの記述方法を教えてください class date{ String str; int number; } public class Main { public static void main() { date dt ←ここの書き方 } }

    • ベストアンサー
    • Java
  • c言語

    (c++ではなくC89準拠) c言語について質問 (1) 関数名()と関数名(void)は違う意味 (2) mainの引数の型は(void)か(int argc, char *argv[]) (3) K&Rは標準c準拠でmain()という表記があります ということは、(1)の関数名とはmain以外の関数名で、 main()とmain(void)は同じなんでしょうか。

  • クラスのthisとは

    前の質問で クラスにコールバック関数を取り入れる事を質問してきました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2310776 コールバック関数をクラス化させる方法については分かりましたが、 Win32に渡す引数のところになぜ(void*)thisをいれたら解決できなのでしょうか? そもそもthisのとはなにか?なぜクラスにはこのようなのが必要なのか不思議です。 thisとは何者なのでしょうか?

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • C++基底クラスに戻り値の異なる関数が宣言されている場合

    こんにちは。 質問させてください。 以下のようなコードがあったとします。 class Base1 { public:   virtual int get()=0; }; class Base2 { public:   virtual float get()=0; }; class Ex : public Base1, public Base2 { public:   int get(){return 0;}   float get(){return 0.0f;} }; void main() { } このプログラムをコンパイルすると 「'Ex::get': オーバーライドする仮想関数の戻り値の型が異なり、'Base1::get' の covariant ではありません。」 というエラーが出てしまいます。 関数の名前と引数が同じで戻り値だけが異なる場合はエラーが出るのはわかるのですが、基底クラスのBase1、Base2は変更不可能だとするとどのように回避すればいいのでしょうか? よろしくお願いします。 /*   WindowsXP Professional SP3   VisualStudio2005 AcademicEdition */

  • C#のdelegateについて

    C#におけるdelegateという仕様って javascriptやPHPにおける無名関数と同じものとおもってさしつかえないのでしょうか? たとえば (1) var funcObj = function (){ alert("無名関数だよ"); }; funcObj(); ーーーーーーーーーーーーーーーーー (2) $func =function(){ print("無名関数"); }; $func(); といった類のもの? たとえば以下のようなC#のコードだと using System; class MainClass{ //delegateの宣言 public delegate void MyMethod(string message); public delegate void NoneMethod(string aaa); public static void Main (string [] args){ //delegateの中身を記述 MyMethod methodA = delegate(string messageA){ Console.WriteLine(messageA); }; //無名関数?として実行 methodA("無名関数?"); //delegateをnewして使用する。 NoneMethod obj =new NoneMethod(OriginalMethod); obj("newして利用する無名関数"); } //delegateの中身を記述 public static void OriginalMethod(string aaa){ Console.WriteLine(aaa); } } 二種類delegateとおもわれるコードを書いております。 この delegateというキーワードをつかってまさに、冒頭のjsやPHPのようなスクリプト言語の ような感じで定義するdelegateと 宣言したdelegateを newしてまるでクラスのように扱う方法 のdelegate この二つの違いはなんでしょうか? バージョンによる、あたらしいか古いかだけですか?

  • C# このクラス型という限定が何を意味しているのか

    まだC#で実際にコーディングできるレベルではないため ネット上のドキュメントを見ていますと 変数の型宣言にクラス名 関数の戻り値にクラス名 のような書き方を目にします 例 public classA x; public classA x(){}; 一般的には、どのように解釈されてますか? また、同様に宣言にインターフェイス名やデリゲート名を使ったもの public IEnumerator<int> x(){}; public delegateA x;など これら宣言時に具体名を記述する文は iintやchar型などの基本的な型宣言と比べて 内部の挙動と、実際の文がうまくリンクできず 少し頭の中が整理できればと思い質問してみました。 今、僕の頭の中で上記の例は ・参照型という宣言である(専用の修飾子がない) ・そもそも型の宣言ではない ・いわゆる定型文なので、これ以上の応用はなく深く理解する必要もない 一体どれが近いんだろう? という感じで困っています。

  • VisualC++でクラスのヘッダーファイルの書き方がわかりません

    今、Visual C++(CLR)を使って、MultiClassという名前のクラスを作っています。 クラスの作り方は大体わかったのですが、 疑問が出ました。以下のように記述するとエラーが発生してしまいます //クラスのヘッダーファイル #pragma once ref class MultiClass { public: void MultiClass(void); }; //クラスのCPPファイル #include "StdAfx.h" #include "MultiClass.h" void MultiClass::MultiClass(void) { } //エラー名 エラー 1 error C2380: 前の型 'MultiClass' (コンストラクタが戻り値の型を返すか、またはクラス名を再定義しています。) エラー 2 error C2533: 'MultiClass::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。 ヘッダーで先頭voidを消して、CPPの先頭voidを消したら正常に 動作するのですが、普通、 戻り値 メソッド名 (引数) なのに、なぜエラーが発生するのですか? さらに2行目以降はなぜ、 void を先頭につけないと エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません というエラーが発生するのでしょうか? ネットで調べてもまったくわかりません わかる方お願いします

専門家に質問してみよう