24

私は次のことをしようとしています:

class Animal
{
    class Bear : public Animal
    {
        // …
    };

    class Giraffe : public Animal
    {
        // …
    };
};

…しかし、私のコンパイラはこれを窒息させているようです。これは合法的なC++ですか?そうでない場合は、同じことを達成するためのより良い方法がありますか?基本的に、よりクリーンなクラス命名スキームを作成したいと思います。Animal(共通の基本クラスから内部クラスを派生させたくありません)

4

5 に答える 5

48

やりたいことはできますが、ネストされたクラスの定義を遅らせる必要があります。

class Animal
{
   class Bear;
   class Giraffe;
};

class Animal::Bear : public Animal {};

class Animal::Giraffe : public Animal {};
于 2009-09-28T12:53:20.890 に答える
15

クラスタイプは、その定義の終わりに達するまで不完全であると見なされます。不完全なクラスから継承することはできないため、囲んでいるクラスから継承することはできません。

編集:訂正
Richard Wolfが私を訂正したように:ネストされたクラスの定義を遅らせると、クラスを囲むことから継承することが可能です。詳細については彼の答えを参照してください。

于 2009-09-28T08:44:40.980 に答える
2

質問には実際には答えませんが、ネストされたクラスを誤用していると思います。名前空間を確認する必要があるかもしれません(ちなみに、答えは「Animalは不完全な型であるため、不可能です」です)。

于 2009-09-28T08:39:47.013 に答える
2

ここで何を達成しようとしているのかはわかりませんが、名前空間を介して取得できる可能性があります。

namespace creatures
{

class Animal
{
};

class Bear : public Animal
{
};

class Giraffe : public Animal
{
};


}

これは、BearとGiraffeを動物のタイプとして宣言しますが、グローバル名前空間を汚染しないように基本クラスを探している場合は、すべてを名前空間に入れます。

于 2009-09-28T09:26:09.540 に答える
0

「逆さまの継承」のATLメソッドを検討することは常に価値があります。これを行う必要があるたびに頭が痛くなりますが、取得するオブジェクトコードの効率は無敵です。どこかで私が今まで見た中で最高の説明であったジム・ベベリッジの記事を切り取ったが、これは今日見つけるのが難しい、私はそれへの参照を見るだけである。

「2004年3月25日...JimBeveridgeからの優れた記事:ATLと逆さまの継承..」

于 2009-12-07T08:06:57.143 に答える