-1

C++でオーバーロードされたコンストラクターを使用してオブジェクトを動的に割り当てるための構文は何ですか?

クラスFooがある場合:

class Foo{
public:
    Foo(string str, int nbr);    // Overloaded constructor
};

そして 2 番目のクラス Foo2 (Foo を使用):

#include "Foo"
class Foo2{
public:
    Foo* myFoo;    // Wrong!
    Foo2(){
        myFoo = new Foo(myStr, myNbr);
    }
};

表示されるエラーは次のとおりです。

「Foo::Foo()」の呼び出しに一致する関数がありません

myFoo オブジェクト ポインターを作成するときに、Foo(string str, int nbr)コンストラクターではなくFoo()コンストラクターを使用するように指定するにはどうすればよいですか。

コンストラクタ委任を使用せずに可能ですか?

4

3 に答える 3

1

構文は正しいです。完全なクラス定義を書いていないため、多くの可能性があります。1. デフォルトの cnstsructor が書き込まれているかどうかを確認します。2. 両方のコンストラクターが public セクション内にあるかどうかを確認します。3. または、以下のようにコンストラクターの呼び出しを変更することもできます。

Foo* myFoo = new Foo("testString", -1);

次のコードは機能するはずです。

class Foo
{

string str;
int num;
public:
    Foo(string p_str, int nbr):str(p_str),num(nbr){};    // Overloaded constructor
    Foo() {};    // Default constructor
};
于 2014-02-27T12:28:15.763 に答える
-1

正しい方法は、各コンストラクターでメンバーを初期化することです。プライベート init() メンバー関数で共通コードを抽出し、次のように各コンストラクターで呼び出すことができます。

class Foo {
    public:
        Foo(string x);
        Foo(string x, int y);
        ...
    private:
        void init(string x, int y);
};

Foo::Foo(string x)
{
    init(x, int(x) + 3);
    ...
}

Foo::Foo(string x, int y)
{
    init(x, y);
    ...
}

void Foo::init(string x, int y)
{
    ...
} 
于 2014-02-27T12:09:29.530 に答える