3

次の宣言があるとします。

class Over1
{
   protected:
      class Under1
      {
      };
};

私は次のことができることを知っています:

class Over2 : public Over1
{
   protected:
        class Under2 : public Under1
        {
        };
};

しかし、Over2 なしで Under2 を宣言する方法はありますか?

Under1 の派生物を使用するには Over1 を拡張する必要があるため、これはばかげているように思えるかもしれませんが、この状況では、30 種類の Under のフレーバーが存在する可能性があります。次のいずれかを実行できます。

  • それらをすべて Over1 内に配置する: Over2 はそれらの 1 つまたは 2 つしか使用しない可能性があるため、魅力的ではありません
  • それらをそれぞれ独自のバージョンの Over に配置します。魅力的ではありません。そのため、ほぼ同じクラスから複数の継承を行う必要があります。
  • Over1 の子を作成せずに Under1 の子を作成する方法を見つける

それで、これは可能ですか?

ありがとう。

4

4 に答える 4

1

テンプレートと明示的な特殊化を使用すると、Over1 でクラス宣言を 1 つ追加するだけでこれを行うことができます。

class Over1
{
protected:
  class Under1
  {
  };

  template <typename T>
  class UnderImplementor;
};

struct Under2Tag;
struct Under3Tag;
struct Under4Tag;

template <>
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1
{
};

お役に立てれば。

于 2008-09-30T16:23:31.067 に答える
1

ネストされたクラスを作成するよりも、これらのクロスを名前空間に埋め込むことを検討することをお勧めします。そうすれば、内部クラスを取得するために外部クラスは必要ありません。Google C++ Style Guideには、賛否両論の素晴らしい議論があります。

于 2008-09-30T16:09:32.720 に答える
0

Under1 を保護したい場合は、定義上、Over1 から継承してアクセスする必要があります。Under1 を公開するか、Douglas が提案したように名前空間を使用することをお勧めします。

現在、これらをテストするためのコンパイラがないため、これらが機能するかどうかはまったくわかりませんが、次のことを試すことができます。

class Over1
{
   protected:
      class Under1
      {
      };

   public:
      class Under1Interface : public Under1 
      {
      };
};

class Under2 : public Over1::Under1Interface
{
};

または、おそらく次のようなものです。

class Over1
{
   protected:
      class Under1
      {
      };
};

class Under2 : private Over1, public Over1::Under1
{
};

あるいは:

class Under2;

class Over1
{
   friend class Under2;

   protected:
      class Under1
      {
      };
};

class Under2 : public Over1::Under1
{
};

それは、Over1 のすべてのプライベートを Under2 にさらすことになりますが、おそらくあなたが望むものではありません.

于 2008-09-30T16:26:05.287 に答える
0

私には少しファンキーなデザインのように聞こえます。コードを別の方法で構造化してみませんか。これは、基本クラスをさまざまなデコレーターでラップして目的の機能を実現できるデコレーター パターンの良い候補になる可能性があると思います。「アンダー」のさまざまなフレーバーがデコレーターになる可能性があります。あなたのコードの意図についてもっと知らなければ、言うのは難しいです。

于 2009-06-08T22:53:22.407 に答える