3

ここに私がやろうとしていることの簡略化されたバージョンがあります

class Firstclass
    {
    public:
    Firstclass(int x)
        {
        //do things with x;
        }
    };

class Secondclass
    {
    public:
    Secondclass()
        {
        Firstclass a(10);
        }

    void func()
        {
        //Do things with a
        }

    private:
    Firstclass a;
    };

したがって、int 引数を取るコンストラクタを持つクラス (Firstclass) があります。ここで、別のクラス (Secondclass) のコンストラクター内にそのクラスのインスタンスを作成したいと思います。

台詞

private:
Firstclass a;

a がクラスではなく単なる変数である場合にどうするか: 最初に言及して、他の場所で使用できるようにします (たとえば、関数 func() で)。コンパイラは Secondclass のコンストラクタが何をすべきかを理解していないため、これはクラスでは機能しないようです。

これを正しく行うにはどうすればよいですか?

4

3 に答える 3

8

member-initializer listを使用して初期化します。

Secondclass() : a(10) { }

Firstclassにはデフォルトのコンストラクターがないため、これは必須です。また、パラメーターを使用したクラス内の初期化は関数宣言とあいまいになるため、クラス本体で行うことができます。C++11 では、これはaggregate-initializationで解決されます。

Firstclass a{10};
于 2013-08-10T17:09:03.427 に答える
3

これを正しく行う方法は、コンストラクターの初期化リストを使用することです。

Secondclass) : a(10)
{
    // ...
}

初期化リストを使用すると、クラスのフィールドであるオブジェクトに対して呼び出されるコンストラクターを指定することもできます。

したがって、存在しないデフォルトのコンストラクターでSecondclassのメンバーを初期化しようとする代わりに、コンストラクター初期化リストを使用して、呼び出されるコンストラクターを指定します。a


C++11 以降、これを行う新しい方法があります。これは集約初期化と呼ばれます。構文は次のとおりです。

T object {arg1, arg2, ...};

この場合a、 はクラスの非静的メンバーであるため、コピー初期化されます。

この特定のケースでのコピー初期化の動作は次のとおりです。

のコンストラクターFirstclassが調べられ、オーバーロードの解決によって最適な一致が選択されます。次にコンストラクターが呼び出され、オブジェクトが初期化されます。

したがって、C++11 を使用する場合、クラスは次のようになります。

class Secondclass
{
public:
    Secondclass()
    {
    }

    void func()
    {
        //Do things with a
    }

private:
    Firstclass a{10};
};

別の間違いを指摘するだけです:

Secondclass()
{
    Firstclass a(10);
}

あなたはここであなたが思うことをしていません。aここでは、コンストラクター スコープにのみ存在する型の変数を宣言していますFirstclass。これは、スコープの最後で破棄されます。aメンバーと同じではありません。

于 2013-08-10T17:09:34.937 に答える
2

FirstClassにはデフォルトのコンストラクターがないため、Secondclass' コンストラクターの初期化リストを使用する必要があります。

Secondclass() : a(10) {}

C++11 では、宣言の時点で非静的データ メンバーを初期化できるため、次のようにすることもできます。

class Firstclass
{
  ....
private:
 Firstclass a{10};
};

ここで行っていること:

Secondclass()
{
  Firstclass a(10);
}

2 つの点で間違っています: 1) 上で述べたように、FirstClassデフォルトのコンストラクターがなくa、初期化リストで初期化しないことで、デフォルトのコンストラクターを呼び出しています。2)コンストラクタ本体のスコープにのみ存在するatypeのローカル変数を宣言しています。Firstclassこれは、データ メンバーと同じではありませんa

于 2013-08-10T17:08:06.037 に答える