0

const 構造体である / const フィールドを持つメンバーを初期化するクラスのコンストラクターをどのように作成すればよいですか?

次の例では、構造体 B 内にコンストラクターを定義し、その const フィールドを初期化するために正常に動作します。

しかし、クラス A 内で構造体 C の const フィールドを初期化するために同じ手法を使用しようとすると、うまくいきません。誰かが私を助けて、私のクラス A を書き直して、それが機能し始めることはできますか?

#include <iostream>
class A
{
public:
    struct C
    {
            C (const int _x) : x (_x) {}
            const int x;
    };

    C c (3);

};
int main (int argc, char *argv[])
{
struct B
{
    B (const int _x) : x (_x) {}
    const int x;
};

B b (2);
std::cout << b.x << std::endl;

A a;
std::cout << a.c.x << std::endl;

return 0;
}

PS

  1. 私はいくつかの検索を行いましたが、C++ 11 をサポートしていないか、boost ライブラリを使用したい場合を除き、初期化リスト内で const 構造体を初期化するヘルパー関数を定義する必要があることを理解しています ( C++ 定数構造体メンバーの初期化) が、同様の構造体を定義する必要があるのはおかしいようですが、非 const フィールドを使用して構造体を const フィールドで初期化しますね。

  2. 私が見つけた別のことは、構造体 C のコンストラクターではなく、クラス A のコンストラクターで const メンバーを初期化する必要があることを示しています ( C++ コンパイル時エラー: 数値定数の前に識別子が必要です)。新しい構造体を追加するたびにクラス コンストラクターを書き直す必要があるのはなぜですか?

私の混乱を明確にする可能性のあるコメントに感謝します。

4

1 に答える 1

4

私はこのような仕事をします:

#include <iostream>
class A {
public:
    struct C {
        C(const int _x) : x(_x) {}
        const int x;
    };

    C c; // (3);
    A() : c(3) {}
};
int main(int argc, char *argv []) {
    A a;
    std::cout << a.c.x << std::endl;

    return 0;
}

ctor inA またはinを使用することの問題ではなく、 ctor for を呼び出す方法を伝えるCための ctorの問題であることに注意してください。渡される値が常に である場合、それは必要ありませんが、オブジェクトを作成するときに選択した値を渡すことができるようにしたいと考えており、その後は一定のままです。AC3C

値が常に同じ3である場合 (この場合)、定数を作成することで物事を大幅に簡素化できますstatic

struct A {
    struct C {
        static const int x = 3;
    };
    C c;
};

int main() { 
    A a;
    std::cout << a.c.x << "\n";
}

したがって、値がそのクラスのすべてのインスタンスで同一である場合は、それを作成しstatic const、所定の場所で初期化すれば、問題ありません。オブジェクトのインスタンスを作成するまで値がわからず、その後そのオブジェクトの存続期間中一定のままである場合は、コンストラクターを介して値を渡す必要があります。

少し異なるケースとして、3 番目の可能性があります。Cが独立したクラス ( 内にネストされていない) である場合、 の他のインスタンスがさまざまな値Aを使用する状況が発生する可能性がありますが、 の内部 のすべてのインスタンスは常に同じ値を使用します。この場合、次のようにします。CCA

struct C { 
    const int x;

    C(int x) : x(x) {}
};

struct A { 
     C c;

     A() : c(3) {}
};

もちろん、 がの内部にネストされている場合も同じことができますが、そうする場合は、通常、 のすべてのインスタンスに同じ値を設定していることを意味するため、代わりにこのアプローチを使用することもできます。明らかな例外は、複数のコンストラクターがある場合です。そのため、(たとえば)の既定のコンストラクターは に 1 つの値を渡し、そのコピー コンストラクターは別の値を渡しました。CACstatic constAAC::x

于 2013-07-04T16:20:37.833 に答える