Utilisation croisée de classes

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Hello,

Je viens à vous car j'ai un petit soucis avec C++. J'imagine qu'elle est plutôt triviale, mais je ne sais pas trop comment la résoudre, et mes recherches n'ont pas donné grand chose (peut-être ai-je donné les mauvais mots-clés au moteur de recherche…)

J'ai deux classes A et B telles que définies ci-dessous :

Fichier a.h :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#ifndef A_H
#define A_H

#include "b.h"

class A
{
    // [...]
    B b;
}

#endif

Fichier b.h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#ifndef B_H
#define B_H

#include "a.h"

class B
{
    // [...]
    A a;
}

#endif

Comme vous pouvez le voir, la classe A utilise donc la classe B et vice-versa.

Le problème c'est que le compilateur me jette avec l'erreur suivante :

1
b.h:9: erreur : 'A' was not declared in this scope

De ce que je comprends, ce problème survient parce que la classe A nécessite que la classe B soit compilée, laquelle nécessite la classe A pour pouvoir être compilée. Il y a donc conflit.

Existe-t-il une façon (élégante, de préférence) pour résoudre ce soucis fâcheux ?

Merci d'avance :)

A graphical interface is like a joke: if you have to explain it, that's shit. | Les logiciels Deuchnord

+1 -0

Cette réponse a aidé l'auteur du sujet

Salut.

Le problème fondamental ici, c'est la présence d'une récursion infinie. A contient un B, qui contient lui-même un A contenant un B, etc. Pour résoudre le problème, il faut que le membre de l'une des classes soit une référence (ou un pointeur). Il faut également faire une déclaration anticipée pour éviter les inclusions croisées.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#ifndef A_H
#define A_H

class B; // Le header est inclut dans le fichier .cpp

class A
{
    // [...]
    B& b;
}

#endif
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#ifndef B_H
#define B_H

#include "a.h"

class B
{
    // [...]
    A a;
}

#endif

Mon Github | Mantra : Un Entity-System en C++

+0 -0

Déjà commençons par poser les question importante: qui est responsable de qui?

Est-ce que A crée B, B crée A, ou les deux sont découplées et ont juste besoin de connaitre l'autre?

Par ce que selon la réponse, ça change tout.

+0 -0
Auteur du sujet

Salut.

Le problème fondamental ici, c'est la présence d'une récursion infinie. A contient un B, qui contient lui-même un A contenant un B, etc. Pour résoudre le problème, il faut que le membre de l'une des classes soit une référence (ou un pointeur). Il faut également faire une déclaration anticipée pour éviter les inclusions croisées.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#ifndef A_H
#define A_H

class B; // Le header est inclut dans le fichier .cpp

class A
{
    // [...]
    B& b;
}

#endif
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#ifndef B_H
#define B_H

#include "a.h"

class B
{
    // [...]
    A a;
}

#endif

Praetonus

Merci, ta solution a fonctionné avec merveille :)

Déjà commençons par poser les question importante: qui est responsable de qui?

Est-ce que A crée B, B crée A, ou les deux sont découplées et ont juste besoin de connaitre l'autre?

Par ce que selon la réponse, ça change tout.

epso

En fait, j'avais une méthode dans la classe A qui retournait un objet de la classe B permettant de faire des calculs sur les propriétés de la classe A… je ne sais pas trop si c'est clair, mais c'est l'idée :-°

La réponse était pourtant dans la FAQ… http://cpp.developpez.com/faq/cpp/?page=Les-classes-en-Cplusplus#Comment-creer-deux-classes-qui-font-reference-l-une-a-l-autre

lmghs

Je me doutais bien que j'avais mal cherché… je n'avais même pas de résultats en provenance de Developpez.com :honte:

C'est pourtant facile, cherche bien et bon courage !

Christopher

Heureusement que tout le monde ne répond pas comme ça sur des questions triviales… :-°

Désolé pour le temps que j'ai mis à répondre, j'ai eu $10^4$ choses à faire ces derniers jours ^^

A graphical interface is like a joke: if you have to explain it, that's shit. | Les logiciels Deuchnord

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte