class Mrowka
{
Slon* on_mnie_zjadl; // odniesienie do slonia
};
class Slon
{
Mrowka zjedzona; // zawieranie mrowki
};
Mrowka m; m.on_mnie_zjadl->costam
Slon s; s.zjedzona.costam
serio nie widzisz roznicy miedzy tymi dwoma przypadkami?
a co do #include, nie jest prawda, ze klasa "Mrowka" powyzej wymaga #include Slon.
jedyne co ta powyzsza definicja mroki wymaga, to uprzedniej deklaracji klasy Slon.
Definicja!=deklaracja. Napisalem Ci juz o forward declaration, prawda?
Aby w/w kod sie kompilowal, wystarczy:
class Slon; // FORWARD DECLARATION. Podpowiadamy kompilatorowi ze "kiedys taka klasa bedzie"
class Mrowka
{
Slon* on_mnie_zjadl; // odniesienie do slonia
};
class Slon
{
Mrowka zjedzona; // zawieranie mrowki
};
//Mrowka m; m.on_mnie_zjadl->costam
//Slon s; s.zjedzona.costam
I po co wiec Mrowce #include calego slonia, ktore by powodowalo cykliczna zaleznosc? Mrowka NIE ZALEZY od definicji klasy slon. Definicja Mrowki ZALEŻĄŁABY od klasy Slon w takim przypadku:
class Mrowka
{
Slon* on_mnie_zjadl;
void gryz_slonia_w_jelita() // metoda z cialem!
{
on_mnie_zjadl->costam // uzycie slonia!
}
};
class Slon
{
Mrowka zjedzona;
};
poniewaz teraz definicja ta zawiera METODE ktorej CIALO uzywa WNETRZA klasy Slon. W takim wypadku wymagane
jest aby cala definicja klasy Slon byla juz-wczesniej znana. Deklaracja nie wystarczy. Co wtedy? Wtedy przypominasz sobie, ze C/C++ maja pliki .CPP i .HPP:
// Plik.HPP
class Slon;
class Mrowka
{
Slon* on_mnie_zjadl;
void gryz_slonia_w_jelita(); // wycinasz cialo metody
};
class Slon
{
Mrowka zjedzona; // zawieranie mrowki
};
// PLIK.CPP
#include "Plik.hpp"
void Mrowka::gryz_slonia_w_jelita()
{
on_mnie_zjadl->costam
}
co teraz sie dzieje? Otoz, w pliku .hpp zniknely uzycia Slonia z Mrowki. DEFINICJA Mrowka nadal uzywa jedynie ODNIESIENIA do Slonia, czyli Slon*, nie dotyka zawartosci Slonia. Dzieki temu definicja Mrowki zostaje w 100% zadowolona poprzez forward-declaration 'class-slon-srednik'. Plik .CPP zas zalacza sobie naglowek .hpp (ktory to naglowek zostal wlasnie naprawiony) i defacto, bedac na samym koncu wszytkiego - zna wszystko i moze uzywac i wnetrza slonia, i wnetrza mrowki.
Wybacz, nie wiem jak Ci to prosciej opisac skoro (chyba) nie zrozumiales szablonu..
Tamten szablon pokazywal dokladnie to o czym teraz pisze. Wystarczy ze swoje pliki .hpp przerobisz zgodnie z nim, i powinno dzialac
..oczywiscie, chyba ze masz 3 tony kodu cial metod w plikach .hpp -- wtedy NIE zadziala, bo nie moze.. ciala trzeba w takim przypadku rozdzielic, nawet jesli sa to template<>'y