14. juni 2005 - 17:44
Der er
15 kommentarer og 1 løsning
infinite include
Jeg har 2 header filer, der hver isaer inkluderer den anden... Min compiler brokker sig. Hvordan loeser man dette normalt?
Annonceindlæg fra SoftwareOne
Prøv med #pagrama once øverst i dine header-filer, vist nok en Visual Studio only feature. Men kommer vist meget an på compileren, hvordan du skal håndtere det.
Hvis de ikke behøver det. Så bare: #ifndef FOOBAR_H #define FOOBAR_H ... #endif men hvis de behøver det så skal du til at kigge på forward erklæringer !
Jeg bruger compileren til eVC. PackageManager.h: #if !defined(AFX_PACKAGEMANAGER_H__37F76946_BD60_4F9D_ADD0_A2221EDDE57E__INCLUDED_) #define AFX_PACKAGEMANAGER_H__37F76946_BD60_4F9D_ADD0_A2221EDDE57E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "BtObexServer.h" ... ... BtObexServer.h: #if !defined(AFX_BTOBEXSERVER_H__37F76946_BD60_4F9D_ADD0_B2221EDDE57E__INCLUDED_) #define AFX_BTOBEXSERVER_H__37F76946_BD60_4F9D_ADD0_B2221EDDE57E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "PackageManager.h" ... ... Brokke brokke brokke siger compileren.
arne_v... idet jeg bruger forward erklaeringer... saa kan jeg ikke kalde nogen funktioner paa objektet eftersom det ikke er defineret.
ikke forstået forward erklæring type A erklæring af type B som indeholder type A men som ikke indeholder nogen operationer erklæring af type A som indeholder type B men som ikke indeholder nogen operationer implementation af type B som indeholder operationer på type A implementation af type A som indeholder operationer på type B
class A class B { A* g_pA; void FunctionB() { g_pA = new A(); g_pA->FunctionA(); // Fejler her, eftersom den ikke kan finde FunctionA. } }
class A; class B { A* g_pA; void FunctionB(); }; class A { ... }; void B::FunctionB() { g_pA = new A(); g_pA->FunctionA(); }
Min ide var at hver klasse skulle ligge i deres egen fil
23. juni 2005 - 23:01
#10
hvis du putter erklæringerne i .h filer og implementationerne i .cpp filer så bør du stadig kunne få det til at virke
24. juni 2005 - 01:00
#11
Som jeg har det nu: // ***************** ClassA.h ********************* #if !defined(CLASS_A) #define CLASS_A #include "ClassB.h" Class A { ClassB* m_b; public: A() {m_b = new ClassB(this);} void FunctionA(); } #endif // ***************** ClassB.h *********************** #if !defined(CLASS_B) #define CLASS_B #include "ClassA.h" Class B { ClassA* m_a; public: B(A* a) {m_a = a;} void FunctionB(); } #endif Derudover har jeg de to cpp filer med hver deres implementering af henholdsvis FunctionA og FunctionB. Dette fungerer ikke, eftersom linkeren siger at der er nogen ting som ikke erklaeret.
24. juni 2005 - 06:34
#12
nu har du ingen forward erklæring !
24. juni 2005 - 16:21
#13
nej... dette var min oprindelige ide... hvilket jeg ikke forstaar hvorfor ikke virker. Hvis jeg i ClassA.h skriver class ClassB; inden jeg erklaerer ClassA, saa kan jeg ikke referere f.eks. FunctionB i linkeren klager.
24. juni 2005 - 19:33
#14
der skal du jo netop dele det jeg laver lige et komplet eksempel
24. juni 2005 - 19:34
#15
a.h --- #ifndef A_H #define A_H class A; #include "b.h" class A { private: B *m_b; public: A(B *b); void FunctionA(); }; #endif // A_H b.h --- #ifndef B_H #define B_H class B; #include "a.h" class B { private: A *m_a; public: void FunctionB(); }; #endif // B_H a.cpp ----- #include <iostream> using namespace std; #include "a.h" A::A(B *b) { m_b = b; } void A::FunctionA() { cout << "Det virker" << endl; } b.cpp ----- #include "b.h" void B::FunctionB() { m_a = new A(this); m_a->FunctionA(); } test.cpp -------- #include "b.h" int main() { B *b= new B(); b->FunctionB(); return 0; } build.bat --------- g++ -c a.cpp -o a.obj g++ -c b.cpp -o b.obj g++ -c test.cpp -o test.obj g++ test.obj a.obj b.obj -o test.exe output ------- C:\>build C:\>g++ -c a.cpp -o a.obj C:\>g++ -c b.cpp -o b.obj C:\>g++ -c test.cpp -o test.obj C:\>g++ test.obj a.obj b.obj -o test.exe C:\>test Det virker
24. juli 2005 - 16:08
#16
OK ?
Kurser inden for grundlæggende programmering