Toon posts:

[C++] Classes die elkaar moeten kennen werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het probleem is dat class1 objecten van class2 moet kennen en andersom.
In Java was dit geen probleem; maar in C++ krijg je tijdens het compilen steeds errors....

Deze treden nu weer op:
code:
1
2
3
4
[C++ Error] class2.h(10): E2303 Type name expected
[C++ Error] class2.h(10): E2139 Declaration missing ;
[C++ Error] class2.h(15): E2293 ) expected
[C++ Error] start.cpp(11): E2316 'setClass' is not a member of 'class2'


Met deze 3 bestanden:

start.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "class1.h"
#include "class2.h"


int main(void) {

    class1 c1;
    class2 c2;

    c1.setClass(&c2);
    c2.setClass(&c1);

    return 0;
}


Class1.h
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef class1_h
#define class1_h

#include "class2.h"

class class1 {

    private:
        int getal;
        class2 *myClass;

    public:
        class1(void);
        int getGetal(void);
        void setClass(class2 *);

};

#endif

class2.h
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef class2_h
#define class2_h

#include "class1.h"

class class2 {

    private:
        int getal;
        class1 *myClass;

    public:
        class2(void);
        int getGetal(void);
        void setClass(class1 *);

};

#endif


Class2.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "class2.h"

class2 :: class2(void) {
    getal = 10;
    getGetal();
}

int class2 :: getGetal(void) {
    return getal;
}

void class2 :: setClass(class1 *newClass) {
    *myClass = *newClass;
}


En class1.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "class1.h"
#include <iostream.h>

class1 :: class1(void) {
    getal = 5;
    cout<<getal<<endl;
}

int class1 :: getGetal(void) {
    return getal;
}

void class1 :: setClass(class2 *newClass) {
    *myClass = *newClass;
}


Het is misschien handig om zelf te kijken; de source: DOWNLOAD


Ik weet echt niet wat er fout is :(

Verwijderd

Als je de #includes "uitwerkt", krijg je het volgende:
In start.cpp wil je class1.h includen,
bovenaan class1.h include je vervolgens class2.h, en
in class2.h wil je dan class1.h weer includen, maar door de #ifndef in class1.h gebeurt dit niet.

Dus in class2.h kent de compiler class1 helemaal niet. Dat is een probleem, want die wordt daar wel gebruikt.

Dit is op te lossen door bovenaan class2.h de klasse class1 te declareren (dus geen definitie, maar een declaratie):
C++:
1
class class1;


Dan is voor de compiler bekend dat het een klasse is, alleen de precieze definitie nog niet. Die volgt later, als class1.h wordt geinclude.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 31-08 15:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

aanvulling op de post van bvrolijk

Bij het declareren van pointer/reference members of parameters is het voor de compiler niet nodig om het type te kennen (de grootte van een pointer/reference is namelijk altijd gelijk). Dat geldt natuurlijk niet als je er een operatie op los wilt laten, maar bij function en class declarations zonder implementatie is dit geen probleem.

Het is een goede zaak om, in plaats van de headers te includen in je class header, gewoon de types de declareren zonder inhoud (dus: class Blaat; struct Woei; enz.). Dat voorkomt dat als je 1 header include alle andere headers ook worden geinclude, waardoor je bij aanpassing van 1 header niet steeds je hele code weer opnieuw moet compilen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.