2016-08-18 1 views
3

je le cas suivant:Ne pas y compris en-tête de classe quand seule déclaration existe

class_a.hpp:

#include "class_b.hpp" // is this "include" mandatory? 
class class_a{ 
private: 
    class_b b; 
}; 

class_a.cpp:

#include "class_b.hpp" 
//code that uses member variables and functions from class_b 

class_b.hpp:

class class_b{}; 

Est-il possible de se débarrasser de #include "class_b.hpp" dans le class_a.hpp? Puisque c'est juste une déclaration, pourquoi je ne peux pas simplement utiliser la déclaration avant et ne pas l'inclure? (J'ai essayé, mais il n'a pas été compilé)

Bien sûr, j'ai inclus class_b.hpp dans le class_a.cpp.

Répondre

9

Depuis class_b doit être stocké à l'intérieur class_a sans indirection (par exemple un pointeur), la taille des class_b doit être connu lors de la déclaration de class_a. Pour connaître la taille, la déclaration class_b doit être disponible: la directive #include est donc requise. Pourquoi je ne peux pas simplement utiliser la déclaration avant et ne pas l'inclure?

+0

Me Silly .. Cela devrait être évident. merci beaucoup –

+0

@HumamHelfawi Si c'est la réponse à votre question, vous devriez l'accepter. –

+0

@PeterK Oui, bien sûr :) il faut du temps avant de pouvoir l'accepter –

3

Avec seule déclaration avant le type de classe class_b sera incomplete type. Mais pour être déclaré en tant que membre de données de classe non statique, il doit être complet, sa taille et sa mise en page doivent être connues.

Tout des contextes suivants exige la classe T soit complète:

... 
declaration of a non-static class data member of type `T`; 
... 

(. En général, lorsque la taille et la disposition des T doivent être connues)