2011-09-10 2 views
-1

Dire que j'ai ces deux classes:dépendances circulaires dans C++

// a.h 

#include "b.h" 

et:

// b.h 

include "a.h" 

Je crois comprendre qu'il ya un problème ici, mais comment puis-je réparer et utiliser a objets et leurs méthodes dans b classe et vice versa?

+3

Le Fantôme de dit StackOverflow, "* Uhhhhhhnnnn ... Neeeeed moooore cooooode ...... *" –

+2

je ne vois pas de cours là-bas, donc je suis downvoting. –

Répondre

2

Vous pouvez utiliser des déclarations en avant, comme ceci:

class B; 

class A 
{ 
    B* ThisIsValid; 
} 

class B 
{ 
    A SoIsThis; 
} 

Pour plus d'informations, consultez this SO question.

En ce qui concerne les préprocesseur #include s, il y a probablement une meilleure façon d'organiser votre code. Sans l'histoire complète, cependant, c'est difficile à dire.

+1

Je l'ai vu où le modèle le plus simple était en avant déclarant dans les fichiers d'en-tête. – Joshua

0

Vous pouvez utiliser ce qu'on appelle une "déclaration avant".

Pour une fonction, ce serait quelque chose comme void myFunction(int);. Pour une variable, cela peut ressembler à extern int myVariable;. Pour un cours, class MyClass;. Ces instructions sans corps peuvent être incluses avant les déclarations portant le code et fournir au compilateur suffisamment d'informations pour produire du code utilisant les types déclarés.

Pour éviter les problèmes avec les inclusions circulaires, utilisez un "include guard" - un #ifdef en haut de chaque fichier d'en-tête qui empêche qu'il soit inclus deux fois.

+0

Cette réponse ne discute pas le vrai noyau de la chose, qui est que vous limitez votre mention de 'B' dans l'en-tête de' A' pour transmettre des choses déclarables, mais dans le fichier source 'A' vous êtes libre de '#include 'la définition complète parce que rien ne va à' # include' le fichier source ... vous n'allez pas avoir de dépendances circulaires avec celui-ci. Cette _only_ affecte les en-têtes, et c'est ainsi que nous pouvons utiliser une approche qui paralyse efficacement l'utilisation d'un type. –

0

La classe "other" ne peut avoir qu'une référence ou un pointeur vers la "première" classe.

dans le fichier ah:

#include "b.h" 

struct a { 
    b m_b; 
}; 

dans le fichier bh:

struct a; 

struct b { 
    a* m_a; 
}; 

void using_the_a_instance(b& theb); 

dans le fichier b.cpp:

#include "b.h" 
#include "a.h" 

void using_the_a_instance(b& theb) 
{ 
    theb.m_a = new a(); 
} 
1

Pour étendre sur la réponse de @Borealid:

Pour éviter les problèmes avec les inclusions circulaires, utiliser un "include guard"

par ex.

#ifndef MYFILE_H /* If this is not defined yet, it must be the first time 
we include this file */ 
#define MYFILE_H // Mark this file as already included 
// This only works if the symbol we are defining is unique. 

// code goes here 

#endif 
Questions connexes