5

C++

内部 (ネストされた) クラスの定義を外部 (囲んでいる) クラスの定義の外側に配置するにはどうすればよいですか? 外部クラスはデータ メンバーとして内部クラスのインスタンスを少なくとも 1 つ持ちます。私は検索しましたが、私が見つけた最も関連性の高いSOの回答であるソースファイルのネストされたクラス定義には、外部クラスがデータメンバーとして内部オブジェクトを持つ例がありません。外部クラスの定義内で内部クラスを宣言するが定義しない限り、私はその答えに従いましたが、私のコードはまだ壊れています:

struct Outer
{
    struct Inner;
    Inner myinner;
    Outer() : myinner(2) {}
};

struct Outer::Inner
{
    Inner(int n) : num(n) {}
    int num;
};

int main()
{
    Outer myouter;
}

error C2079: 'Outer::myinner' uses undefined struct 'Outer::Inner'VC11でエラーが発生します。

そして、次の作業コードのように、壊れたコードが のInner定義内で定義されているバージョンと同等の効果を持たないのはなぜですか?Outer

struct Outer
{
    struct Inner
    {
        Inner(int n) : num(n) {}
        int num;
    } myinner;
    Outer() : myinner(2) {}
};
4

1 に答える 1

6

これは危険信号ですが、偽のテンプレートを使用して実行できます。

template< typename = void >
struct Outer_temp
{
    struct Inner;
    Inner myinner;
    Outer_temp() : myinner(2) {}
};

typedef Outer_temp<> Outer; // Hide template from user.

template< typename v >
struct Outer_temp< v >::Inner
{
    Inner(int n) : num(n) {}
    int num;
};

int main()
{
    Outer myouter;
}

Innerテンプレート内は依存型であるため、メンバーまたはその他のコンテキストでインスタンスを定義するときに完全である必要はありません。インスタンス化が発生したら、完了する必要があるだけです。この場合はmain.

これを行う正当な理由は想像できませんが、それはあります。

プログラムの編成のために、ネストされたクラスを使用しないでください。入れ子は、「アウターによって提供されるコンテキスト以外では、インナーは存在できない」という概念的な依存関係を示唆しています。たとえば、コンテナー ノード クラスをコンテナー内にネストすることは一般的ですが、これにより問題が発生する可能性があります。SCARY イディオムは、そのような組織化を否定し、一般性を向上させるデザイン スタイルです。

TL;DR: 2 つのクラスを個別に定義し、ネストされた でリンクしますtypedef

于 2013-11-21T00:31:03.803 に答える