IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

"error:invalid use of undefined type" ok, mais je comprends pas


Sujet :

C++

  1. #1
    Membre chevronné
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Points : 2 015
    Points
    2 015
    Par défaut "error:invalid use of undefined type" ok, mais je comprends pas
    Salut à tous,

    J'ai un bug sur un script, le compilo me renvoie "error:invalid use of undefined type". Bon j'ai bien compris que cette erreur veut dire que je me sers mal de mon bazar, mais là je comprends pas en quoi...

    Alors je vous mets les fichiers pour faire simple:
    FaEntretien.h
    Code c++ : 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
    21
     
    #ifndef FAENTRETIEN_H
    #define FAENTRETIEN_H
     
    namespace CSC_Entretien
    {
     
    #include "cctrlentretien.h"
    class CCtrlEntretien;
     
    class FaEntretien
    {
    	public:
    		FaEntretien(int p_SeuilPermanent, int p_SeuilClignotant, int p_SeuilVidange, int p_SeuilFiltreAir, int p_SeuilGeneral);
    		~FaEntretien();
    	private:
    		CCtrlEntretien* controleur;
    };
     
    }
    #endif
    FaEntretien.cpp
    Code c++ : 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
    #include "faentretien.h"
    #include <iostream>
     
    namespace CSC_Entretien
    {
     
    FaEntretien::FaEntretien(int p_SeuilPermanent, int p_SeuilClignotant, int p_SeuilVidange, int p_SeuilFiltreAir, int p_SeuilGeneral)
    {
    	CCtrlEntretien* ctrl = new CCtrlEntretien(p_SeuilPermanent, p_SeuilClignotant, p_SeuilVidange, p_SeuilFiltreAir, p_SeuilGeneral, this);
    	this->controleur = ctrl;
    	std::cout << "Construction facade entretien : " << this << std::endl;
    }
     
    FaEntretien::~FaEntretien()
    {
    }
     
    }
    CCtrlEntretien.h
    Code c++ : 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
    21
    22
    23
    24
    #ifndef CCTRLENTRETIEN_H
    #define CCTRLENTRETIEN_H
     
    namespace CSC_Entretien
    {
     
    #include "faentretien.h"
    class FaEntretien;
     
    class CCtrlEntretien
    {
    	public:
    		CCtrlEntretien(int p_SeuilPermanent, int p_SeuilClignotant, int p_SeuilVidange, int p_SeuilFiltreAir, int p_SeuilGeneral, FaEntretien* facade);
    		~CCtrlEntretien();
    	private:
    		FaEntretien* facade;
    		int m_Compteur;
    		int m_SeuilClignotant;
    		int m_SeuilPermanent;
    };
     
    }
     
    #endif
    CCtrlEntretien.cpp
    Code c++ : 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
    #include "cctrlentretien.h"
    #include <iostream>
     
    namespace CSC_Entretien
    {
     
    CCtrlEntretien::CCtrlEntretien(int p_SeuilPermanent, int p_SeuilClignotant, int p_SeuilVidange, int p_SeuilFiltreAir, int p_SeuilGeneral, FaEntretien* p_Facade)
    {
    	this->facade = p_Facade;
    	this->m_Compteur = 0;
    	this->m_SeuilClignotant = p_SeuilClignotant;
    	this->m_SeuilPermanent = p_SeuilPermanent;
    	std::cout << "Construction controleur entretien : " << this << std::endl;
    }
     
    CCtrlEntretien::~CCtrlEntretien()
    {
    }
     
    }

    Mon IDE (DevCpp) me dit que c'est dans FaEntretien.cpp sur la ligne:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    CCtrlEntretien* ctrl = new CCtrlEntretien(p_SeuilPermanent, p_SeuilClignotant, p_SeuilVidange, p_SeuilFiltreAir, p_SeuilGeneral, this);

    Mais je comprends pas. Quelqu'un a une idée?
    Merci d'avance
    Bonne nuit à tous!
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    En regardant rapidement, je dirais qu'il manque l'inclusion de CCtrlEntretien.h dans FaEntretien.cpp. La déclaration anticipée est valide tant que la classe est utilisée pour déclarer des références ou des pointeurs. Dès que tu alloues, tu a besoin de connaître la classe d'où la nécessité d'inclure l'en-tête contenant la déclaration complète de la classe.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Petite rectification :
    Citation Envoyé par gwinyam Voir le message
    Code c++ : 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
    21
    #ifndef FAENTRETIEN_H
    #define FAENTRETIEN_H
    
    namespace CSC_Entretien
    {
    
    // #include "cctrlentretien.h" -> A mettre dans le CPP et pas ici (ou alors avant le namespace) !
    class CCtrlEntretien;
    
    class FaEntretien
    {
    	public:
    		FaEntretien(int p_SeuilPermanent, int p_SeuilClignotant, int p_SeuilVidange, int p_SeuilFiltreAir, int p_SeuilGeneral);
    		~FaEntretien();
    	private:
    		CCtrlEntretien* controleur;
    };
    
    }
    #endif
    FaEntretien.cpp
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "faentretien.h"
    #include "cctrlentretien.h" 
    #include <iostream>
    Idéalement, j'aurais fait un CCtrlEntretienFwd.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef CCTRLENTRETIENFWD_H
    #define CCTRLENTRETIENFWS_H
     
    namespace CSC_Entretien
    {
       class CCtrlEntretien;
    }
    #endif /*CCTRLENTRETIENFWS_H*/
    Puis :
    FaEntretien.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef FAENTRETIEN_H
    #define FAENTRETIEN_H
     
    #include "CCtrlEntretienFwd.h"
    namespace CSC_Entretien
    {
       class FaEntretien
       {
    Et :
    FaEntretien.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "faentretien.h"
    #include "CCtrlEntretien.h"
    #include <iostream>
     
    namespace CSC_Entretien
    {
    Et tu as le problème symétrique dans CCtrlEntretien.h qui inclue #include "faentretien.h" dans le namespace CSC_Entretien.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    Inclure des headers DANS des namespaces, ca ne m'a pas l'air très "good practice" !
    (bien que j'adorerais pouvoir faire ca avec windows.h si ils avaient pas autant de fichus put*** de defines qui ne sont pas scopées !)

Discussions similaires

  1. vc\include\deque(518) : error C2027: use of undefined type
    Par MoonDragon dans le forum C++/CLI
    Réponses: 5
    Dernier message: 13/04/2012, 12h20
  2. Réponses: 2
    Dernier message: 16/08/2009, 13h20
  3. Réponses: 6
    Dernier message: 24/07/2009, 14h44
  4. error:invalid use of undefined type
    Par assif dans le forum C++
    Réponses: 2
    Dernier message: 25/10/2006, 21h11
  5. [VB6] Compile error: Invalide use of New Keyword
    Par ironik dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/05/2006, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo