Question

Supposons que j'ai la déclaration suivante:

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

Je sais que je pourrais faire ce qui suit:

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

Mais existe-t-il un moyen de déclarer Under2 sans Over2?

Étant donné que vous devez utiliser Over1 pour utiliser tout dérivé de Under1, cela peut sembler idiot, mais dans cette situation, il pourrait y avoir 30 saveurs différentes de Under. Je peux soit:

  • Placez-les tous à l'intérieur. Over1: Not attrayant puisque Over2 ne peut utiliser que 1 ou 2 d'entre eux
  • Mettez-les chacun dans leur propre version de Over: Not attrayant depuis lors, vous aurez multiplier hériter de presque la même classe.
  • Trouvez un moyen de créer enfants de moins de 1 an sans créer enfants de Over1

Alors, est-ce possible?

Merci.

Était-ce utile?

La solution

À l'aide de modèles et de spécialisations explicites, vous pouvez le faire avec une seule déclaration de classe supplémentaire dans Over1.

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

J'espère que cela vous aidera.

Autres conseils

Mieux que de créer des classes imbriquées, vous pouvez envisager d’incorporer ces closses dans un espace de noms. De cette façon, vous n'avez pas besoin de la classe externe pour obtenir la classe interne. Il existe de bons arguments pour et contre dans le guide de style de Google C ++ . .

Si vous voulez garder Under1 protégé, vous devez par définition hériter de Over1 pour y accéder. Je suggérerais de rendre public Under1 ou d'utiliser des espaces de noms, comme l'a suggéré Douglas.

Je n'ai pas le compilateur pour les tester pour le moment, je ne suis donc pas du tout sûr que cela fonctionnerait, mais vous pouvez essayer ceci:

class Over1
{
   protected:
      class Under1
      {
      };

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

class Under2 : public Over1::Under1Interface
{
};

Ou peut-être quelque chose comme ça:

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

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

Ou même:

class Under2;

class Over1
{
   friend class Under2;

   protected:
      class Under1
      {
      };
};

class Under2 : public Over1::Under1
{
};

Bien que cela exposerait tous les membres privés de Over1s à Under2 - ce n'est probablement pas ce que vous voudriez.

Cela me semble un peu génial. Pourquoi ne pas essayer de structurer votre code différemment. Je pense que cela pourrait éventuellement être un bon candidat pour le motif de décorateur, où vous pourriez envelopper votre classe de base dans divers décorateurs pour obtenir la fonctionnalité souhaitée, les différentes saveurs de «sous» pourraient être des décorateurs. Juste une pensée, difficile à dire sans en savoir plus sur les intentions de votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top