Bonjour,

Voici un cas d'école afin d'illustrer le plus simplement possible mon problème:

Je rencontre des difficultés à passer un pointeur de class1 au constructeur de class2.

L'objectif est que class2 puisse appeler une méthode de class1.


Voici le code:

class1.h

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef CLASS1_H
#define CLASS1_H
 
#include <iostream>
#include "class2.h"
 
using namespace std;
 
class class1
{
public:
    class1();
 
    void methodAlpha();
 
private:
    class2 *m_obj_class2;
};
 
#endif // CLASS1_H


class1.cpp

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "class1.h"
 
class1::class1()
{
    cout << "instanciated class 1!" << endl;
    m_obj_class2 = new class2(this);  // J'instancie un objet de type class2, en passant un pointeur sur class1
 
    methodAlpha();
}
 
void class1::methodAlpha()
{
    cout << "class1::methodAlpha() can call class2::methodBeta()" << endl;
    m_obj_class2->methodBeta();
}



class2.h

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef CLASS2_H
#define CLASS2_H
 
#include <iostream>
#include "class1.h"                  // J'inclus le prototype de class1...
 
using namespace std;
 
class class2
{
public:
    class2(class1 *parent);        // ...afin que le type soit reconnu ici
 
    void methodBeta();
 
private:
    class1 *m_obj_class1;        // ...et ici
};
 
#endif // CLASS2_H


class2.cpp

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
#include "class2.h"
 
class2::class2(class1* parent)
{
    m_obj_class1 = parent;
    cout << "instanciated class 2!" << endl;
}
 
void class2::methodBeta()
{
    m_obj_class1->methodAlpha();
}


À la compilation, j'obtiens les deux erreurs suivantes:

class2.h:12:19: error: expected ')' before '*' token
class2.h:17:5: error: 'class1' does not name a type

J'ai commenté temporairement le #include "class1.h" du fichier class2.h, juste pour voir, et j'obtiens les mêmes erreurs.
Je pense qu'il y a un conflit avec les inclusions suivantes:
dans class1.h > #include "class2.h".
dans class2.h > #include "class1.h"Du coup j'ai tenté ceci en même lieu et place, c'est pareil...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
#ifndef CLASS1_H
#define CLASS1_H
#include "class1.h"
#endif

Comment procéderiez vous pour faire fonctionner ce code?



PS: C'est étrange, habituellement je travaille avec des classes Qt (QWidget, QDialog, ...) et je suis sûr d'avoir déjà effectué des choses du genre, sans souci...