es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceder a un miembro de base en una clase, que deriva de una clase anidada en una clase de plantilla.

Me gustaría tener una plantilla que tiene una clase anidada. Luego me gustaría tener una plantilla que herede la primera plantilla y también tenga una clase anidada. Luego me gustaría que esta clase anidada herede la clase anidada de su clase principal propietaria. Puedo hacerlo, pero no puedo acceder a los miembros de la primera clase anidada desde otra clase. ¿Qué estoy haciendo mal, o es completamente imposible? ¿Por qué? ¿Qué tengo que hacer para solucionar el problema (si es posible)/decisión alternativa (si es imposible)?

“`cpp
template <class t,="" class="" t2="">
class Clase1
{
public:
class ClaseAnidada1;
};

template <class t,="" class="" t2="">
class Clase1<t, t2="">::ClaseAnidada1
{
public:
void Hacer()
{
}
};

template <class t="">
class Clase2 : public Clase1<t, int="">
{
public:
class ClaseAnidada2;
};

template <class t="">
class Clase2<t>::ClaseAnidada2 final : public Clase2<t>::ClaseAnidada1
{
public:
void Hacer2()
{
this->Hacer(); // ¿Por qué no hay "Hacer" aquí?
}
};
“`</t,></t,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No es posible acceder a los miembros de la primera clase anidada desde la segunda clase anidada porque la segunda clase anidada no hereda directamente de la primera clase anidada. En cambio, hereda la clase propietaria (Class2), que ha heredado la primera clase anidada como clase base.

    Para solucionar esto, necesitamos utilizar el operador de resolución de ámbito para especificar la clase base desde la cual queremos acceder a la función miembro. Podemos cambiar la línea this->Do(); a Class1<t, int="">::NestedClass1::Do(); para acceder a la función Do() de la primera clase anidada.

    Alternativamente, podemos hacer que la primera clase anidada sea un miembro público de la clase propietaria (Class1) y heredarla directamente en la segunda clase anidada (NestedClass2). De esta manera, podemos acceder a sus miembros sin usar el operador de resolución de ámbito. El código actualizado se verá así:

    template<class t="">
    class Class1
    {
    public:
        class NestedClass1 {
        public:
            void Do() {}
        };
    };
    
    template<class t="">
    class Class2: public Class1<t>::NestedClass1
    {
    public:
        class NestedClass2: public Class1<t>::NestedClass1
        {
        public:
            void Do2()
            {
                Do(); // podemos acceder a la función miembro sin usar el operador de resolución de ámbito
            }
        };
    };
    

    En esta implementación, hemos convertido NestedClass1 en un miembro público de Class1, y luego lo hemos heredado directamente en NestedClass2. Ahora podemos acceder a la función Do() usando this->Do() o simplemente Do().</t,>

Comments are closed.