2009-09-28 10 views
17

私は、次の操作を実行しようとしている:入れ子になったC++クラスは、その囲むクラスを継承できますか?

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

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

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

+2

開始のために、あなたはクラス宣言の後にセミコロンで閉じる括弧を実行する必要があります。 –

+0

私はなぜあなたがこれをしたいと思うのか不明です。私が正しく理解すれば、Bearクラスはその内部にBearクラスを持ちますが、これはちょっと奇妙です。 –

答えて

37

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

class Animal 
{ 
    class Bear; 
    class Giraffe; 
}; 

class Animal::Bear : public Animal {}; 

class Animal::Giraffe : public Animal {}; 
2

本当に質問には答えませんが、ネストしたクラスを誤って使用していると思います。おそらくネームスペースちなみに答えは「動物は不完全な型なので不可能です」)。

15

クラスの型は、定義の終わりに達するまで不完全とみなされます。不完全なクラスから継承することはできないので、クラスを囲むことから継承することはできません。

EDIT:修正
リチャード・ウルフが私を修正したよう:あなたは、ネストされたクラスの定義を遅らせる場合が囲むクラスから継承することが可能です。詳細は彼の答えを見てください。

+1

含まれているクラスを前方宣言することができます。 –

+1

囲んでいるクラスの外側にネストされたクラスを定義することは許可されていませんでした。しかし、私は驚いたことにそれを試してみました。 –

+0

@tkopec、あなたの声明を訂正するためにあなたの答えを編集してみませんか?それはあなたの2つのポイントを戻すと、私は私を与えるだろう。私はそれが間違っていることを知っています。 –

2

私はあなたがここで達成しようとしていることは明らかではありませんが、あなたは名前空間でそれを得ることができるかもしれません。

namespace creatures 
{ 

class Animal 
{ 
}; 

class Bear : public Animal 
{ 
}; 

class Giraffe : public Animal 
{ 
}; 


} 

これは、動物の種類としてクマやキリンを宣言していますがグローバル名前空間を汚染しないように、基本クラスを探している場合は、名前空間に全部を置きます。

0

「アップサイド・ダウン継承」のATLメソッドを検討することは常に価値があります。これを行う必要があるたびに頭が痛くなりますが、オブジェクトコードの効率は最高です。私が今までに見た最良の説明であったJim Beveridgeの記事を切り捨てたところ、今日は見つけるのが難しいです。

「2004年3月25日...ジム・ベヴァリッジからの優れた記事:ATLとアップサイドダウン継承..」

+0

記事は電気天国になりましたが、archive.orgの礼儀はhttp://web.archive.org/web/20070805214320/http://apostate.com/programming/atlupsidedown.htmlからアクセスできます。 – ndkrempel

関連する問題