質問

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

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:Not それ以来魅力的です ほとんどから継承する 同じクラス。
  • 作成する方法を見つける 作成せずにUnder1の子 Over1の子

これは可能ですか?

ありがとう。

役に立ちましたか?

解決

テンプレートと明示的な特殊化を使用すると、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
{
};

これがお役に立てば幸いです。

他のヒント

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

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

これらを今すぐテストするコンパイラーがないので、これらが機能するかどうかはまったくわかりませんが、試してみてください:

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
{
};

ただし、すべてのOver1sプライベートをUnder2に公開しますが、おそらくあなたが望むものではありません。

ちょっとファンキーなデザインのように聞こえます。コードの構造を変えてみてください。これはデコレーターパターンの良い候補になると思います。基本クラスをさまざまなデコレーターでラップして、目的の機能を実現できます。「アンダー」のさまざまなフレーバーはデコレーターになります。あなたのコードの意図についてもっと知ることなく伝えるのは難しい思考です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top