2009-10-22 13 views
7

Tengo problemas para implementar una clase anidada cuyo constructor se inicializa con algunos de los miembros de datos privados de la clase adjunta.Clase anidada 'acceso a la clase adjunta' miembros de datos privados

Ejemplo:

Header File: 
class Enclosing { 
    //...Public members 
    //...Private members 
    int x, int y 
    class Inner; // Declaration for nested class 
}; 

Impl. File: 
// Stuff... 
class Enclosing::Inner { 
    explicit Inner() : foo(x), bar(y) // foo and bar are data members of Inner 
    //... 
}; 

me sale un error invalid use of non-static data member. ¿Hay algo que me falta cuando se trata de acceso de clase anidado a los miembros de su clase adjunta?

Respuesta

18

miembro x y y son miembro de datos no estáticos de Enclosing, lo que significa que solo existe dentro de un objeto concreto de la clase Enclosing. Sin un objeto concreto, no existen x ni y. Mientras tanto, intentas consultar x y y sin un objeto. Eso no se puede hacer, que es lo que el compilador intenta decirle.

Si desea inicializar los miembros Inner::foo y Inner::bar de x y y, tiene que pasar un objeto concreto de Enclosing tipo en el Inner s constructor. Por ejemplo

class Enclosing::Inner {  
    explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y) 
    {} 
    //... 
}; 

nota adicional: en el C++ 98 la clase interna original tiene privilegios especiales está accediendo a la clase externa. Con el compilador C++ 98, deberá otorgar a la clase interna los privilegios necesarios (amistad) o exponer los miembros x y y como públicos. Sin embargo, esta situación se clasificó como defect en C++ 98, y se decidió que las clases internas deberían tener pleno acceso a los miembros de la clase externa (incluso a los privados). Por lo tanto, si tiene que hacer algo extra con respecto a los privilegios de acceso depende de su compilador.

+1

Gracias. Leí sobre el defecto en C++ 98 mientras investigaba por mi cuenta, y no estaba seguro de qué hacer con él. Gracias por aclarar todo. – trikker

8

El problema con su código es not visibility, como ha señalado AndreyT, pero que una instancia de la clase Inner no está unido a un ejemplo concreto de la clase Enclosing. En otras palabras, al construir un Inner el compilador no tiene forma de saber para qué objeto tomar los valores x y y.

Usted tendrá que proporcionar explícitamente una instancia de la clase Enclosing al constructor de la clase Inner como tan:

class Enclosing 
{ 
private: 
    int x; 
    int y; 

    class Inner 
    { 
    private: 
    int foo; 
    int bar; 

    public: 
    explicit Inner(const Enclosing& e) 
     : foo(e.x), bar(e.y) 
    { } 
    }; 
}; 
0

clase anidada no puede acceder a los datos miembro de aligustre de encerrar class.compiler muestran un error si se intenta acceder miembro de aligustre de clase envolvente, sólo puede acceder el miembro de datos pública de la clase envolvente .....

Cuestiones relacionadas