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";
Ten błąd pojawia się, gdy kompiluję z klasą Outer :: Inner 'nie ma elementu członkowskiego o nazwie `var'
c++
inner-classes
kal
źródło
źródło
Klasa wewnętrzna ma dostęp do wszystkich członków klasy zewnętrznej, ale nie ma niejawnego odwołania do instancji klasy nadrzędnej (w przeciwieństwie do pewnych dziwactw w Javie). Więc jeśli przekażesz referencję do klasy zewnętrznej do klasy wewnętrznej, może ona odwołać się do czegokolwiek w instancji klasy zewnętrznej.
źródło
Wszystko, co jest częścią Outer, powinno mieć dostęp do wszystkich członków Outer, publicznych lub prywatnych.
Edycja: twój kompilator jest poprawny, var nie jest członkiem Inner. Ale jeśli masz odniesienie lub wskaźnik do wystąpienia Outer, może uzyskać do niego dostęp.
źródło
var nie jest członkiem klasy wewnętrznej.
Aby uzyskać dostęp do zmiennej, należy użyć wskaźnika lub odwołania do instancji klasy zewnętrznej. Np. pOuter-> var zadziała, jeśli klasa wewnętrzna jest przyjacielem zewnętrznej lub var jest publiczna, jeśli ściśle przestrzega się standardu C ++.
Niektóre kompilatory traktują klasy wewnętrzne jak przyjaciela zewnętrznej, ale niektóre nie. Zobacz ten dokument dla kompilatora IBM :
„Klasa zagnieżdżona jest zadeklarowana w zakresie innej klasy. Nazwa klasy zagnieżdżonej jest lokalna dla klasy otaczającej. O ile nie używasz jawnych wskaźników, odwołań lub nazw obiektów, deklaracje w klasie zagnieżdżonej mogą używać tylko widocznych konstrukcji, w tym nazwy typów, statyczne elementy członkowskie i moduły wyliczające z otaczającej klasy i zmiennych globalnych.
Funkcje składowe klasy zagnieżdżonej są zgodne ze zwykłymi regułami dostępu i nie mają specjalnych uprawnień dostępu do członków klas obejmujących. Funkcje składowe klasy otaczającej nie mają specjalnego dostępu do elementów składowych klasy zagnieżdżonej. "
źródło
friend
lubpublic
. Kogo obchodzi, czy IBM w przeszłości się mylił / był przestarzały, gdy znajdował się w martwym łączu? Ta odpowiedź była już nieaktualna 3 lata przed opublikowaniem.Przede wszystkim próbujesz uzyskać dostęp do niestatycznego elementu członkowskiego
var
poza klasą, co nie jest dozwolone w C ++.Odpowiedź Marka jest poprawna.
Możesz więc zrobić dwie rzeczy, zadeklarować
var
jakostatic
lub użyć odwołania do instancji klasy zewnętrznej, aby uzyskać dostęp do zmiennej (ponieważ zaprzyjaźniona klasa lub funkcja również potrzebuje odwołania, aby uzyskać dostęp do prywatnych danych).Static var
Zmień
var
nastatic
Jeśli nie chceszvar
być powiązany z wystąpieniami klasy.Wyjście - var: 1
Niestat. Var
Odwołanie do obiektu musi mieć dostęp do wszelkich niestatycznych zmiennych składowych.
Wyjście - var: 1
Edytuj - linki zewnętrzne to linki do mojego bloga.
źródło