2012-04-21 11 views
0

オブジェクトは、オブジェクトが作成された後でのみ、クラス内の変数に割り当てられます。 そのクラスに別のクラスのオブジェクトである変数があり、その変数にコンストラクタがある場合はどうなりますか?コンストラクタをC++で呼び出す

class Wand 
{ 
    mouse mouseEmu(0,0); 
    QCursor pt; 
}; 

mouseEmuQCursorは、2つのクラス... mouseEmuのコンストラクタが呼び出され、ときptのデフォルトコンストラクタが呼ばれるのですか?

ですか

指定されている場合は、パラメータ化されたコンストラクタを呼び出す必要がありますか?

答えて

1

これは正当なC++構文ではありません。関数を宣言しているようですが、0は有効な型識別子ではありません。

サブオブジェクト(基本とメンバ変数)のコンストラクタは、コンパイラ生成コンストラクタを含め、クラスのコンストラクタから呼び出されます。

ctor-initializer-listでは、サブオブジェクトのコンストラクタにパラメータを指定できます。それは次のようになります。

class Wand 
{ 
    mouse mouseEmu; 

    QCursor pt; 
public: 
    Wand() : mouseEmu(0,0) {} 
}; 

この方法では、あなたのmouseEmuサブオブジェクトは2パラメータのコンストラクタで初期化され、そしてptはデフォルト(ゼロパラメータ)のコンストラクタで初期化されます。

コンパイラ生成コピーコンストラクタは、コピーコンストラクタを呼び出し、コピーされるWandオブジェクトのメンバーを渡すことによって、両方のサブオブジェクトを初期化します。

2

いつmouseEmuのコンストラクタが呼び出され、いつptのデフォルトコンストラクタが呼び出されますか?

現在のオブジェクトのコンストラクタの本体が入力される前に、現在構築されているオブジェクトのすべてのデータメンバーとベースクラスのサブオブジェクトがすべて完全に構築されます。したがって、クラスにユーザ定義コンストラクタがある場合、ユーザ定義コンストラクタ内のコードが実行されるまでに、そのクラスの他のすべてのサブオブジェクトはコンストラクタを完了しています。

何らかの理由でサブオブジェクトのユーザー定義の初期化値を設定する必要があり、そのサブオブジェクトにデフォルト以外のコンストラクタがある場合は、現在のオブジェクトのコンストラクタで初期化リストを使用できますサブオブジェクトのコンストラクタに値を渡します。例えば:あなたが欲しい

class Wand 
{ 
    mouse mouseEmu; 
    QCursor pt; 

    Wand(): mouseEmu(0,0) {} //empty constructor body with initialization list 
}; 
+0

だけではなく、メンバーのサブオブジェクト、ベースサブまた-objectsワンドと間違って何 –

+0

::ワンド(){ mouseEmu(0,0);}。。 –

+0

mouseEmuオブジェクトの再初期化されるので、はい私は再びエラー – CppLearner

2

新しい質問(またはあなたが到着したときに応じて、古い)

class Wand 
{ 
    mouse mouseEmu(0,0); 
      // ^^^^^^ This bit is illegal. 
      //   Remove it here. You specify the parameters 
      //   Passed to members in the constructor. 
    QCursor pt; 
}; 

は次のとおりです。

class Wand 
{ 
    Ward(): mouseEmu(0,0) {} 
    mouse mouseEmu; 
    QCursor pt; 
}; 

編集:に基づいて

回答それが違法に変更される前の質問。

あなたは、コンパイラ工場あなたのための暗黙のデフォルトコンストラクタコンストラクタを提供しない場合:あなたはワンドのオブジェクトを作成するときに

Wand::Wand() 
    : mouseEmu() 
    , pt() 
{} 

のthousを。 Wandオブジェクトの構築の一環として、メンバー(mouseEmuおよびpt)を自動的に作成および初期化します。コンストラクタを呼び出す(クラスで宣言された順序で)。

注:独自のコンストラクタを定義している場合。しかし、明示的にメンバーの構築の順序が宣言の常にためである(その後、メンバーのデフォルトコンストラクタが暗黙的に呼び出され、あなたのメンバーのコンストラクタを呼び出すことはありません。

// Example: 
// If you did: 

class Wand 
{ 
     Wand(int x) : mouseEmu(0,x) {} 

     // The above will generate this logical code. 
     Wand(int x) : mouseEmu(0,x), pt() {} 
} 
+0

ok..thanks for answering –

+0

質問は違法な構文に変更されていませんでした。 –

+0

Lokiの混乱のために申し訳ありません、それは私のせいでした... – Jason

関連する問題