Pregunta

Supongamos que tengo la siguiente declaración:

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

Sé que podría hacer lo siguiente:

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

¿Pero hay una manera de declarar Under2 sin Over2?

Ya que tendría que extender Over1 para usar cualquier derivado de Under1, esto puede parecer una tontería, pero en esta situación puede haber 30 sabores diferentes de Under. Yo puedo:

  • Póngalos a todos dentro de Over1: No atractivo ya que Over2 solo puede usar 1 o 2 de ellos
  • Ponlos cada uno en su propia versión de Over: Not atractivo desde entonces tendras para multiplicar heredar de casi el misma clase.
  • Encuentra una manera de crear hijos de Under1 sin crear hijos de Over1

¿Es esto posible?

Gracias.

¿Fue útil?

Solución

Usando plantillas y especializaciones explícitas, puede hacer esto con solo una declaración de clase adicional en 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
{
};

Espero que esto ayude.

Otros consejos

Mejor que crear clases anidadas, es posible que desee ver cómo incrustar esos cierres en un espacio de nombres. De esa manera, no necesitas la clase externa para obtener la clase interna. Hay algunos grandes argumentos a favor y en contra en Guía de estilo de Google C ++ .

Si desea mantener protegido Under1, entonces, por definición, debe heredar de Over1 para acceder a él. Sugeriría hacer público Under1, o usar espacios de nombres como sugirió Douglas.

No tengo el compilador para probar esto en este momento, así que no estoy seguro de que funcionen, pero puedes probar esto:

class Over1
{
   protected:
      class Under1
      {
      };

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

class Under2 : public Over1::Under1Interface
{
};

O tal vez algo como esto:

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

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

O incluso:

class Under2;

class Over1
{
   friend class Under2;

   protected:
      class Under1
      {
      };
};

class Under2 : public Over1::Under1
{
};

Aunque eso expondría a todos los privados de Over1s a Under2, no es probable que quieras algo.

Me suena como un poco de diseño original. ¿Por qué no intentar estructurar su código de manera diferente? Creo que este podría ser un buen candidato para el patrón de decorador, en el que podría ajustar su clase base en varios decoradores para lograr la funcionalidad deseada, los distintos sabores de 'under' podrían ser decoradores. Solo un pensamiento, difícil de decir sin saber más sobre las intenciones de su código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top