2012-01-24 19 views
7

È possibile definire una classe in un'altra classe privata e usarla per una matrice? Ad esempio:Come definire una classe all'interno di un'altra classe 'privata in C++

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

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

Ignorare il pubblico, c'è qualcosa di sbagliato nella mia sintassi?

È anche possibile rendere una funzione membro in A per modificare i valori privati ​​di b. Ad esempio, myarray [0] .a_val = 5; In tal caso, anche questa sintassi è corretta?

+0

Sei costruttore di 'b' ha un argomento' int' chiamato 'a' ma hai anche una classe chiamata' a'. questo è confusionario. – Foggzie

risposta

0

Sì, è possibile dichiarare le classi privatamente all'interno di altre classi.

Sì, è possibile utilizzarli come tipo di matrice purché la classe stessa sia visibile all'utente in cui si crea l'array.

0

No, è tutto a posto. Significa solo è possibile dichiarare solo le istanze di B all'interno di Classe A, che si fermerà alle persone di fare:

a::b myB; 

a dichiarare la propria b, che è presumibilmente quello che vuoi.

5

No, la sintassi per la definizione di una classe nidificata privata va bene. Sebbene alcune altre cose siano errate: è necessario definire b prima di creare un array. Il tipo deve essere completo.

b non è il valore predefinito, quindi è necessario inizializzare l'array nell'elenco di inizializzazione del costruttore a, che in realtà non è possibile in C++ 03. C++ 11 offre elenchi di inizializzatori per ottenere quella funzionalità.

Basta usare uno std::vector o std::array.

versione fissa del codice:

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ì, va bene, ma è necessario definire la classe annidata completamente prima di dichiarare un array di esso: array possono essere effettuate solo di completi tipi:

class Outer 
{ 
    class Inner { /* define it! */ }; 
    Inner a[100]; 
}; 
Problemi correlati