LostOblivion Skrevet 24. april 2010 Del Skrevet 24. april 2010 (endret) Hei, Hvordan løser man problemet med syklisk header-avhengighet? La oss ta eksempelet under: A.hpp: #ifndef _A_HPP_ #define _A_HPP_ #include "B.hpp" class A { public: A() { } void DoSomethingWithA() { std::cout << "Hello, World! This is A." << std::endl; } void SomethingElse(B* b) { b->DoNothing(); } }; #endif // _A_HPP_ B.hpp: #ifndef _B_HPP_ #define _B_HPP_ #include "A.hpp" class B { public: A* a; B() { a = new A(); a->DoSomethingWithA(); delete a; } void DoSomethingWithB() { std::cout << "Hello, World! This is B." << std::endl; } void DoNothing() { } }; #endif // _B_HPP_ La oss si at vi inkluderer A.hpp for programmet vårt og kompilerer: #include "A.hpp" int main() { A* a = new A(); a->DoSomethingWithA(); delete a; return 0; } Hva skjer? Jo, class B vet ikke om class A enda når kompilatoren kommer til definisjonen av class B. Jeg vil jo at headerne skal funke "hver for seg" når de blir inkludert alene og sammen med headere. Og da må jeg inkludere de headerne som trengs for at klassene i denne headeren skal funke. Hvordan får jeg dette til å funke? Endret 24. april 2010 av LostOblivion Lenke til kommentar
LostOblivion Skrevet 25. april 2010 Forfatter Del Skrevet 25. april 2010 Fant det ut. Delte filene mine inn i .hpp- og .cpp-filer og la til forward-declarations hvor det trengtes. Lenke til kommentar
Dead_Rabbit Skrevet 12. mai 2010 Del Skrevet 12. mai 2010 Generelt lønner det seg å bruke forward declarations når det er mulig. F.eks. i ditt tilfelle så har du i B bare en peker til et A-objekt, og da trenger ikke kompilatoren å kjenne til klasse-definisjonen. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå