2016-07-17 8 views
-2

これは非常に基本的な質問です。変数宣言後にコンストラクタを呼び出すにはどうすればよいですか?例えば、これは、作業コードです:宣言後にコンストラクタを呼び出す

// in header 
class Bar 
{ 
    SomeClass *foo; 
public: 
    Bar(); 
} 

// in .cpp 
Bar::Bar() 
{ 
    foo = new SomeClass(1, 2, 3); 
} 

しかし、どのように私はこれを変更することができますので、fooがポインタではありませんか?

ありがとうございます!

+1

「クラス内の」というコメントは何を意味していますか?問題の具体例を追加してください。今のところ私は例**のない**として閉じることにしました。 –

+0

@ Cheersandhth.-Alf私は質問を編集しました。 –

+0

OK、私はクローズアップ投票を撤回しました。 –

答えて

1

あなたfooは、次のようにコンストラクタ初期化子リストを使用して、クラス内で定義されている場合:

class X { 
    X() : foo(1,2,3) {} 
    SomeClass foo; 
}; 

あなたはfoo -sコンストラクタに計算された引数に必要がある場合、それはより困難になります。すなわち、それはあなたがあなたの値を計算する方法に依存します - あなたは、あなたの値は:

class X { 
    X() : foo(initX(),initY(),initZ()) {} 
    SomeClass foo; 

    static int initX() { return 1;} 
    static int initY() { return 2;} 
    static int initZ() { return 3;} 
}; 

、すなわちこれは常に可能ではないでしょう計算機能を追加することができます。 (完全に構築されたクラスメンバーではない方がよいので、静的なものは意図的です)。

これらの値をコンストラクタパラメータとして渡すこともできます。

+0

本当ですか?つまり、これは共通の問題でなければなりません。いくつかの変数(クラス)を持つクラスがあり、それを(デフォルトのctorではなく)いくつかの引数を持つコンストラクタと呼びたいとします。だから唯一の解決策は、ポインタを使用することです? –

+1

@MartinHeralecký私のedit2を参照してください、これは解決策だと思います – marcinj

+0

最初の編集を元に戻しましたが、実際には 'foo'が2回構築されていることに気付きました。 – ArchbishopOfBanterbury

1

置き換え

class Bar 
{ 
    SomeClass *foo; 
public: 
    Bar(); 
}; 

Bar::Bar() 
{ 
    foo = new SomeClass(1, 2, 3); 
} 

…

class Bar 
{ 
private: 
    SomeClass foo; 

public: 
    Bar(); 
}; 

Bar::Bar() 
    : foo{ 1, 2, 3 } 
{} 
+0

これは、計算された引数の問題を解決しません。 –

+0

@MartinHeralecký:それは電子レンジからの悪い音の問題を解決するものではありません。しかし、その問題は今のところどこにも言及されていません。 「計算された議論の問題」とは何ですか?それが自明でないと判明した場合は、新しい質問を投稿してください。既存の質問を実質的に変更しないでください。既存の質問が無効になるためです。 –

+0

Downvoter、あなたのdownvoteを説明してください。 –

1

これをクラス外で宣言している場合は、グローバル変数になります。それは、.cppファイルに構築してきたために、あなたはおそらく、あなたがCPP

SomeModule.hでそれを宣言するとき、あなたが欲しい、コンストラクタを使用して、ヘッダではextern、それを宣言しなければならない:

extern SomeClass foo; 

SomeModule.cpp :

SomeClass foo(1, 2, 3); 

それは、クラスのメンバ変数は、あなたが明示的にコンストラクタのメンバー初期化リスト内の変数を初期化することで、必要なコンストラクタを使用することができます場合は

OtherClass.h:

class OtherClass 
{ 
    SomeClass foo; 
    public: 
     OtherClass(); 
} 

OtherClass.cpp:

OtherClass::OtherClass() : foo(1, 2, 3) {}; 

ポインタの場合と同じように、コードの途中で初期化したい場合、あなたはそれがデフォルトコンストラクタで初期化させることができますポインタを同じようにしたい値でコピーしてください。

foo = SomeClass(1, 2, 3); 
関連する問題