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 :

Conflit entre class et struct


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut Conflit entre class et struct
    Bonjour,
    J'utilse 3 classes dans un programme de la manière suivante :
    la class Task:
    Elle possède un pointeur sur PreviousManager
    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
    21
    22
    23
    24
    25
     
     
     
    class Task : public  ProcessObject
    {
    protected:
     
    	bool m_bIsExecuted;
    	bool m_bResult;
    	bool m_bLaunch;
    	bool m_bIsLaunched;
    	PreviousManager* m_pPrevious;
    public:
    	Task();
    	~Task();
     
    //	bool execute(){return true;};
    //	bool check() {return true;};
    	bool check(){return true;};
    	bool execute(){return true;};
    	bool getIsExecuted();
    	bool getResult();
    	bool getLaunch();
    	bool getIsLaunched();
    };
    La classe PreviousManager qui est une liste de pointeurs sur Previous:
    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
     
    #ifndef PREVIOUSMANAGER_H_
    #define PREVIOUSMANAGER_H_
     
    class PreviousManager
    {
    private:
    	vector<Previous*> m_lstListPrev;
     
    public:
    	PreviousManager();
    	virtual ~PreviousManager();
    	bool addPrev( Task* T, bool iscrit, bool cond) ;
    	bool removePrev(Previous* p);
    	bool checkCond(Previous * P);
    };
     
    #endif /*PREVIOUSMANAGER_H_*/
    et enfin la classe Previous:
    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
    21
     
    class Task;
     
    class Previous
    {
    private:
    	Task* m_pT;
    	bool m_bIsCriteria;
    	bool m_bCond;	
     
    public:
    	Previous();
    	Previous (Task *T,bool iscrit, bool cond);
    	~Previous();
     
    	bool getIsCriteria();
    	bool getCond();
    	void setIsCriteria(bool b);
    	void setCond(bool b);
    	Task* getTask();
    };
    ensuite pour les includes:
    dans Task.cpp:
    #include "Previous.h"
    #include "PreviousManager.h"
    #include "Task.h"

    dans PreviousManager.cpp:
    #include "Previous.h"
    #include "PreviousManager.h"

    et dans Previous.cpp:
    #include "Previous.h"

    Alors j'ai été obligé de rajouter la ligne "class Task;" dans la classe Previous car sinon j'avais une boucle sur les includes. En effet un Task possède un PreviousManager qui est une liste de Previous qui eux même sont des Tasks particulières (j'espère que ca vous paraît clair )

    Mon problème est dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bool PreviousManager::checkCond(Previous* P)
    {
    	// si le Previous na pas de condition alors on retourne true
    	
    	if (!(P->getIsCriteria()))
    		return true;
    	if ((P->getCond())==((P->getTask())->getResult()))
    		return true;
    	else
    		return false;
    }
    La ligne en rouge me donne une erreur du type:
    Severity and Description
    error: forward declaration of `struct Task' DIS Previous.h line 4
    error: invalid use of undefined type `struct Task' DIS PreviousManager.cpp line 58

    Je pense que la classe Previous n'a pas pris en compte le fait que la ligne "class Task" signifiait que la classe Task existe mais est définié ailleurs. Elle la voit comme une struct.

    Je sais pas si j'ai été assez clair, j'espère que certains d'entre vous sauront m'aidé.
    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Tu dois inclure "Task.h" dans ton "PreviousManager.cpp"

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    J'ai déjà essayé et ça me fait une boucle sur les includes et donc une erreur à la compilation. Et j'ai essayé toutes les séquences dans les includes entre les 3 classes.

  4. #4
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Je pense à un pb de références croisées. Essayes ici FAQ

  5. #5
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Pour bien comprendre, il te faut arriver à distinguer, les moments ou tu as besoin qu'un élément syntaxique soit déclaré, des moments où tu as besoin qu'il soit définit.

    J'entend par "déclaré", le fait que tu aie déjà dit qu'ils existaient et de quelle nature ils étaient.
    Ceci par exemple :
    veut dire : il existe un élément syntaxique qui s'appelle Previous et qui est une classe (donc previous est un nom de type).

    J'entend par "définit", le fait que tu aie déjà dit comment un élément syntaxique se comporte.
    Ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Previous
    {
       void m();
    };
    veut dire : il existe un élément syntaxique qui s'appelle Previous, qui est une classe et qui peut être utilisée de la façon suivante : en appelant une fonction boid Previous::m();

    En particulier :
    1. ta classe PreviousManager contient des pointeurs de Previous.
    Pour faire référence à un pointeur de quelque chose il suffit de savoir que le quelque chose en question est un nom de type (par opposition au fait que ce soit le nom d'une variable, une valeur d'enum, le nom d'une fonction ...)
    Donc au moment où tu écris :
    tu dois déjà avoir mis quelque part en amont :
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Previous
    {
    ...
    }
    ou
    2. Ta fonction PreviousManager::checkCond utilise la fonction getResult() qui est une fonction de Task.
    Pour pouvoir utiliser cette fonction, il faut qu'au moment où tu l'écris, la classe Task soit définie, pour que tu puisse affirmer que tu as le droit d'utiliser cette fonction.
    Si tu avais appelé la fonction tataYoYo() qui n'existe pas, tu aurais voulu que cela ne compile pas.

    Il faut donc que tu aie déjà écrit en amont :
    ou
    mais en aucun cas tu ne peux imaginer que
    soit suffisant

    Voici comment on fait d'habitude dans un cas simple
    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
    21
    22
    -------------          
    |fichier A.h |         ------------          
    -------------          |fichier B.h|
    |struct B;   |         ------------
    |struct A    |         |struct A;  |
    |{           |         |struct B   |
    |   void m();|         |{          |
    |  B* p;     |         |  A* p;    |
    |}           |         |  void m();|
    -------------          |}          |
                           |           |
                           -------------
    --------------
    |fichier A.cpp|        ---------------
    --------------         |fichier B.cpp |
    |A::m()       |        ---------------
    |{            |        |#include "A.h"|
    |   ....      |        |B::m()        |
    |}            |        |{             |
    -------------          |   p->m();    |
                           |}             |
                           -------------

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    Je comprends tout à fait ce que tu veux dire. Mon souci c'est que j'ai bien essayer de le caser dans PreviousManager ce #include "Task.h" mais j'ai toujours une erreur à la compilation et le type Task n'est plus reconnu du tout.

    Dans mon compilateur, Previous est compiler en premier sur les 3. C'est lors de la compilation de PreviousManager que l'erreur survient. Je comprends que c'est parce que j'instancie une variable Task et fais appel aux méthodes de cette classe sans "l'inclure" dans PreviousManager.

    Si je mets un #include "Task.h" dans PreviousManager, j'aurai une boucle car les includes sont dans ce sens dans Task.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "Previous.h"
    #include "PreviousManager.h"
    #include "Task.h"
    C'est de la que vient la boucle. Si je dois rajouter un Task.h dans PreviousManager, je n'arrive pas trouver où exactement je dois le rajouter.

  7. #7
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Hum, je n'avais probablement pas compris.

    Si ton problème vient du fait que tu inclus deux fois le même fichier de déclaration (.h) depuis le même fichier d'implémentation (.cpp), par deux chemins différents, c'est en effet autre chose.

    Il te faut protéger tous tes fichiers de déclaration afin qu'il ne puissent pas être inclus plusieurs fois.

    cela se fait facilement grace à des directives de précompilation en écrivant au début de chaque .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef MACLASSTASK
    #define MACLASSTASK
    en choisissant un identifiant pour chaque fichier, ici j'ai pris MACLASSETASK, mais pour chaque fichier tu dois en prendre un différent

    sans oublier de terminer le fichier par :
    Ainsi chaque fichier de déclaration n'est inclus qu'une seule fois dans chaque fichier d'implémentation.

    Du coup l'ordre des includes n'a plus aucune importance.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    C'est une bonne idée. Cependant mon patron refuse que je mettes des includes dans les .h et je ne sais pas si ça marchera dans les .cpp (mes premiers tests suite à ton post n'ont pas marchés mais c'est surement une erreur de ma part).

    Mais j'aimerai savoir comment tu t'y prendrai dans les includes si tu dois avoir:
    - une classe A qui possède une variable de type B
    -une classe B qui possède une liste de variable de type C
    - et une classe C qui possède un pointeur sur un type A.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [script.aculo.us] Conflit entre 2 classes "clé en main" (autosuggest)
    Par marsupix dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 29/08/2007, 17h31
  2. Conflit entre java.util.Date et class java.sql.Date
    Par vonitiana dans le forum Langage
    Réponses: 3
    Dernier message: 30/06/2006, 11h43
  3. conflit entre les classe java.sql.* et java.util.*;
    Par obydissonn dans le forum Langage
    Réponses: 4
    Dernier message: 26/05/2006, 18h00
  4. conflit entre couleurs
    Par khayyam90 dans le forum OpenGL
    Réponses: 2
    Dernier message: 03/07/2004, 18h00
  5. [Technique] Conflits entre plusieurs requêtes
    Par Neowile dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 24/03/2003, 09h37

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