3

基本クラスをその派生の名前空間として使用できるこのパターンを考えました。これは、すべての派生が事前にわかっている場合に便利です。サブクラスに形容詞を使用したい場合は、これが良い例の 1 つです。このパターンに名前はありますか?

class Flag
{
public:
  class White;
  class Chequered;
  // ...
};

class Flag::White: public Flag
{
  // ...
};

class Flag::Chequered: public Flag
{
  // ...
};
4

2 に答える 2

4

クラスを名前空間として使用することはアンチパターンです。namespace代わりに使用してください。

ネストされたクラスをusing宣言の対象にすることはできないため、 がなければ、クライアント コードではなくtypedef参照するしかFlag::Chequeredありません。Chequeredあなたが言ったように、すべての導関数は事前にわかっていなければなりません。の定義なしで前方宣言することはできませんclass Flag。囲みを持つだけで、クラスのクラスターにnamespace演算子を適用できるなどの利点があります。std::relops

美学は言葉の乱用を補うことはありません。代替案は次のとおりです。

namespace flags {
class Base;
class White;
class Chequered;
}

typedef flags::Base Flag; // independent concept goes into enclosing namespace

形容詞を使用してクラスに名前を付ける練習の名前はわかりませんが、見栄えがします。短い名前は適切であり、::オペレーターは常にそれを支援します。

于 2013-01-22T00:32:19.370 に答える
2

それらは、実際にはキーワードを使用せずに、非常に複雑な名前空間と呼ばれますnamespace

ただし、概念自体は内部クラスと呼ばれ、 Java などの一部の言語では珍しくありません。

于 2013-01-22T00:33:18.497 に答える