Avatar billede Lasse Novice
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?
Avatar billede htm Nybegynder
14. juni 2005 - 17:58 #1
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.
Avatar billede arne_v Ekspert
14. juni 2005 - 18:04 #2
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 !
Avatar billede Lasse Novice
14. juni 2005 - 18:08 #3
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.
Avatar billede Lasse Novice
14. juni 2005 - 18:33 #4
arne_v... idet jeg bruger forward erklaeringer... saa kan jeg ikke kalde nogen funktioner paa objektet eftersom det ikke er defineret.
Avatar billede arne_v Ekspert
14. juni 2005 - 19:19 #5
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
Avatar billede arne_v Ekspert
23. juni 2005 - 15:18 #6
??
Avatar billede Lasse Novice
23. juni 2005 - 16:25 #7
class A

class B
{
A* g_pA;

void FunctionB()
{
g_pA = new A();
g_pA->FunctionA(); // Fejler her, eftersom den ikke kan finde FunctionA.

}
}
Avatar billede arne_v Ekspert
23. juni 2005 - 16:28 #8
class A;

class B
{
  A* g_pA;
  void FunctionB();
};

class A
{
  ...
};

void B::FunctionB()
{
  g_pA = new A();
  g_pA->FunctionA();
}
Avatar billede Lasse Novice
23. juni 2005 - 22:57 #9
Min ide var at hver klasse skulle ligge i deres egen fil
Avatar billede arne_v Ekspert
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
Avatar billede Lasse Novice
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.
Avatar billede arne_v Ekspert
24. juni 2005 - 06:34 #12
nu har du ingen forward erklæring !
Avatar billede Lasse Novice
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.
Avatar billede arne_v Ekspert
24. juni 2005 - 19:33 #14
der skal du jo netop dele det

jeg laver lige et komplet eksempel
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
24. juli 2005 - 16:08 #16
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester