Le classi interne possono accedere a variabili private?

class Outer { class Inner { public: Inner() {} void func() ; }; private: static const char* const MYCONST; int var; }; void Outer::Inner::func() { var = 1; } const char* const Outer::MYCONST = "myconst"; 

Questo errore quando compilo con la class Outer :: Inner ‘non ha alcun membro chiamato `var’

Una class interiore è un’amica della class in cui è definita.
Quindi sì; un object di tipo Outer::Inner può accedere alla variabile variabile membro di un object di tipo Outer .

A differenza di Java, tuttavia, non esiste alcuna correlazione tra un object di tipo Outer::Inner e un object della class genitore. Devi rendere la relazione genitore figlio manualmente.

 #include  #include  class Outer { class Inner { public: Inner(Outer& x): parent(x) {} void func() { std::string a = "myconst1"; std::cout << parent.var << std::endl; if (a == MYCONST) { std::cout << "string same" << std::endl; } else { std::cout << "string not same" << std::endl; } } private: Outer& parent; }; public: Outer() :i(*this) ,var(4) {} Outer(Outer& other) :i(other) ,var(22) {} void func() { i.func(); } private: static const char* const MYCONST; Inner i; int var; }; const char* const Outer::MYCONST = "myconst"; int main() { Outer o1; Outer o2(o1); o1.func(); o2.func(); } 

Una class interna ha accesso a tutti i membri della class esterna, ma non ha un riferimento implicito a un’istanza della class genitore (a differenza di alcune stranezze con Java). Quindi se si passa un riferimento alla class esterna alla class interna, può fare riferimento a qualsiasi cosa nell’istanza di class esterna.

Tutto ciò che fa parte di Outer dovrebbe avere accesso a tutti i membri di Outer, pubblici o privati.

Modifica: il tuo compilatore è corretto, var non è un membro di Inner. Ma se hai un riferimento o un puntatore a un’istanza di Outer, potrebbe accedervi.

var non è un membro della class interna.

Per accedere a var, è necessario utilizzare un puntatore o un riferimento a un’istanza di class esterna. per esempio pOuter-> var funzionerà se la class interna è un amico di outer, oppure var è public, se si segue rigorosamente lo standard C ++.

Alcuni compilatori trattano le classi interne come l’amico dell’esterno, ma alcuni potrebbero non farlo. Vedi questo documento per il compilatore IBM :

“Una class nidificata viene dichiarata nell’ambito di un’altra class.Il nome di una class nidificata è locale alla sua class di inclusione. A meno che non si utilizzino puntatori, riferimenti o nomi di object espliciti, le dichiarazioni in una class nidificata possono utilizzare solo costrutti visibili, inclusi nomi di tipi, membri statici ed enumeratori dalla class che racchiude e variabili globali.

Le funzioni membro di una class nidificata seguono le normali regole di accesso e non hanno privilegi di accesso speciali per i membri delle loro classi che li accludono. Le funzioni membro della class che acclude non hanno accesso speciale ai membri di una class nidificata. ”