Wskaźnik na niezdefiniowaną klasę składową - składnia

0

Mam pytanie dotyczące składni c++. Dla niektórych pewnie jest głupie.
Coś takiego jest dozwolone przez msvc:

class A *a;
class A {};

Coś takiego również:

class A {
	class B;
	B* b;
};
class A::B {};

A coś takiego już nie:

class A {
	class B* b;
};
class A::B {};

Dlaczego?

0

... może dlatego,że najpierw musisz zdefiniować klasę, a potem dopiero możesz stworzyć jej obiekt? nie jestem tego pewien ale tak to wygląda

0

Nie tworzę nigdzie obiektu. To tylko wskaźnik.

0

Poza tym wszystkim co napiszę, nigdy się nie spotkałem z zapisem np.

class B* b; 

więc nie wiem czy wszystko co napiszę jest prawdą

class A *a;
class A {}; 

Tutaj deklarujesz wskaźnik na klasę A i potem definiujesz klasę A.

class A {
    class B;
    B* b;
};
 

Tutaj masz klasę A, w której jest zagnieżdżona klasa B. Oraz w klasie A masz wskaźnik na obiekt klasy B.
To

class A::B {}; 

jest definicją konstruktora klasy B

class A {
    class B* b;
};

Tutaj masz klasę A i w niej wskaźnik na obiekt klasy B. A tu

class A::B {};  

Prubujesz zdefiniować konstruktor klasy B klasę B, która jest zagnieżdżona w klasie A. Tyle, że w klasie A czyli tu

class A {
    class B* b;
}; 

nie ma nigdzie deklaracji zagnieżdżonej klasy B. Dla tego kompilator się buntuje.

0

@stryku
Chyba coś pokręciłeś.

class A::B {};

To nie jest definicja konstruktora w żadnym wypadku.

Poza tym, wiem co robią te kody (a przynajmniej te dwa pierwsze). Spytałem się jedynie, dlaczego nie działa ostatni zapis, który powinien robić dokładnie to samo, co poprzedni. Póki co, mam teorie, że nie spodobał się on dla kogoś, kto projektował ten język.

6

Za namową @Endrju piszę wyjaśnienie. W trzecim przypadku B nie jest deklarowane jako wewnętrzna klasa A i stąd błąd kompilacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1