2016-10-30 16 views
7

私はそれが本当に何であるかわからないので、タイトルについてはわかりません。C++の構造体とtypdef

私は以下のリンクのコードを理解しようとしていました。

Color Based Particle Filter

私は一般的にプログラムが何をするのかを理解し、私は「state.h」を見つけ出すことができませんでした。このコードは何をしていますか?特に、 "typedef"、 "State_"、 "pp"の部分は私にとっては見知らぬものです。

わかりやすくするために、ここでコードの一部を記載します。

struct StateData; 
struct State_; 
typedef State_ (*State)(StateData&); 
struct State_ 
{ 
    State_(State pp) : p(pp) { } 
    operator State() 
    { 
     return p; 
    } 
    State p; 
}; 

State_ state_start(StateData& d); 
State_ state_selecting(StateData& d); 
State_ state_initializing(StateData& d); 
State_ state_tracking(StateData& d); 

どんな種類のヘルプがあれば幸いです。

答えて

5

への参照を受け入れるState_を返す:Stateは、関数ポインタのエイリアスです。 State_は、Stateのメンバーを持ち、暗黙のうちにStateに変換可能なラッパークラスです。

State_ラッパーが必要な理由は、同じタイプの関数へのポインタを返す関数を表現する方法がないためです。ラッパーは自己参照を取り除きます。ラインによって


ライン:

struct StateData; 

クラスStateDataの前方宣言。

struct State_; 

クラスの前方宣言State_

typedef State_ (*State)(StateData&); 

これは少しトリッキーです。これは、を返し、引数としてStateData&を受け取る関数を指すことができる関数ポインタの型エイリアスとしてStateを定義します。スニペットの最後に宣言された関数は、この型の関数ポインタで指し示すことができます。

私の意見では、すでにState_クラスがあることを考えると、選択した名前は非常に混乱しています。私はハンガリアン記法に対して通常だが、私は常に関数ポインタを表すために、接尾辞もしくは接頭辞を適用することをお勧めします、これはState_ calssの定義を開始しstate_funstate_handlerまたはstate_callback

struct State_ 
{ 

言います。

State_(State pp) : p(pp) { } 

これは、クラスのコンストラクタを定義します。引数は、前に定義した関数ポインタ型の引数です。まもなく宣言されるメンバーを初期化します。

operator State() 
    { 
     return p; 
    } 

メンバ関数です。より具体的には、ユーザ定義関数ポインタ型への変換を定義した。

State p; 

コンストラクタで初期化されたメンバーを宣言します。

}; 

State_ state_start(StateData& d); 
State_ state_selecting(StateData& d); 
State_ state_initializing(StateData& d); 
State_ state_tracking(StateData& d); 

フリー関数です(Stateで示されます)。

+0

ありがとうございますが、私は "演算子"関数を理解していません。もっと説明できますか? @ user2079303 –

+0

@ AnitaW.Smithあなたはどうしたら分かりませんか?ユーザー定義のコンバージョンを勉強しましたか? – user2079303

+0

これまで聞いたことがありません。私はそれを検索します。この場合説明が簡単な場合は、簡単に教えてください。 @ user2079303 –

3

State_は構造タイプです。

Stateは、StateData&のパラメータを受け取り、State_を返す関数へのポインタです。

typedef a b;は、タイプbを定義します。これは、aとまったく同じです。

pは、State_のフィールドであり、ppはコンストラクタのパラメータです。 p(pp)pp

1

の値にpを初期化し、唯一のコンストラクタのための特別な構文です。この1は、名前StateData

struct StateData; 

を持つ構造体を宣言typedefのキーワードがタイプ
例えば新しいエイリアスを作成して使用しています:

typedef int mynumber; /// mynumber is an alias of type of int 
mynumber number = 3; /// so you can do this (number is a type of int just the int name is different) 

これの利点の1つは、mの大量のインスタンスを持つ場合、特に変数のデータ型を簡単に変更できることですynumber:
例:

typedef int mynumber; 
mynumber number1 = 3; 
mynumber number2 = 4; 
mynumber number3 = 5; 
// what if you want to make all this type of double? or a float? easy 
// just change the int to a double or float like this 
    typedef float mynumber; 
    typedef double mynumber; 

この1つは名前State_

struct State_; 

この1は、上記の宣言されたState_を定義して構造体を宣言します。

struct State_ 
{ 
    State_(State pp) : p(pp) { } 
    operator State() 
    { 
     return p; 
    } 
    State p; 
}; 

これはpを初期化するリストです。 struct(i、e。State p)内に と宣言されたpを初期化します。

State_(State pp) : p(pp) 
{ 
} 

これらのプロトタイプの機能はStateData

簡潔
State_ state_start(StateData& d); 
State_ state_selecting(StateData& d); 
State_ state_initializing(StateData& d); 
State_ state_tracking(StateData& d); 
1

typedefは、関数へのポインタを定義するときに役立ちます。次のヘッダを持つ関数があります。 State_は戻り値の型であり、入力はStateDataへの参照です。

State_ function (StateData&) 

次に、この機能へのポインタを説明するためにstar(優先順位を解決するための括弧)を追加します。

次に、その前にtypedefを入れて新しいタイプとして定義します。今では、他の場所で使用できる新しいタイプがあります。 typedefを使用して、コードを読みやすくするためのエイリアスを作成します。

typedef State_ (*State) (StateData&) 

このタイプの状態は、別の場所で使用できます。typedefを使用して関数へのポインタ型を指定することができること

State_(State pp) 

が他方を取る関数を書く作るコンストラクタへの入力として、この新しいタイプの

State p 

を使用して、新しい国家のタイプを使用して、新しい変数pを宣言非常に読みやすい入力として機能します。

+0

C++の質問、初心者ならCの本を読んで誰もすることはない – deW1

+0

私は質問からその本を削除しました。 –