2012-01-24 35 views
7

¿Es posible definir una clase en otras clases privadas y usarla para una matriz? Por ejemplo:Cómo definir una clase dentro de otra clase 'privada en C++

class a 
{ 
    public: 
    private: 
    class b; 
    b myarray[10]; 

    class b 
    { 
     public: 
     b(int a):a_val (a){} 
     private: 
     int a_val; 
    }; 
}; 

Ignorando el público, ¿hay algún problema con mi sintaxis?

También es posible hacer una función de miembro en A para modificar los valores privados de b. Por ejemplo, myarray [0] .a_val = 5; Si es así, ¿esta sintaxis también es correcta?

+0

Eres constructor de 'b' tiene un argumento' int' llamado 'a' pero también tienes una clase llamada' a'. esto es confuso. – Foggzie

Respuesta

0

Sí, puede declarar las clases de forma privada dentro de otras clases.

Sí, puede utilizarlos como el tipo de una matriz, siempre que la clase en sí sea visible para usted donde crea la matriz.

0

No, está completamente bien. Sólo significa que sólo se puede declarar las instancias de la clase B dentro de una, lo que la gente deje de hacer:

a::b myB; 

para declarar su propia b, que presumiblemente es lo que quiere.

5

No, su sintaxis para definir una clase anidada privada está bien. Aunque algunas otras cosas son incorrectas: debe definir b antes de crear una matriz. El tipo debe estar completo.

b no es predefinible, por lo que también debe inicializar la matriz en la lista de inicializadores del constructor a, que en realidad no es posible en C++ 03. C++ 11 ofrece listas de inicializadores para obtener esa funcionalidad.

Solo use un std::vector o std::array.

versión fija de su código:

class a 
{ 
public: 
    // ATTN C++11 feature here 
    a() : myarray({ 1, 2}) {} 
private: 
    class b { 
    public: 
    b(int a) : a_val (a){} 
    int a_val; 
    }; 
    b myarray[2]; 
}; 
int main() 
{ 
    a a; 
} 
2

Sí, eso está bien, pero hay que definir la clase anidada totalmente antes de declarar una matriz de que: Las matrices se pueden hacer solamente de completos tipos:

class Outer 
{ 
    class Inner { /* define it! */ }; 
    Inner a[100]; 
}; 
Cuestiones relacionadas