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 :

Séparer un programme


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Par défaut Séparer un programme
    Bonjour,

    J'ai un petit problème avec la création de classes séparées en c++. J'ai un gros programme en c++ qui contient une dizaine de classes dans le même cpp. Donc, pour plus de claireté, j'ai pensé les séparé dans des fichiers .cpp distincts et j'ai un petit problème.

    Lorsque j'essaie de compiler cette classe, j'ai mille et une erreurs de compilations, quelqu'un sait pourquoi ?

    Dans la classe principale :
    typedef set<Test, less<Test> > Ensemble;

    Dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class EnsembleTest
    {
    	public:
    		EnsembleTest();
    		set<Test>::iterator getDebut();
    		set<Test>::iterator getFin();
    		Ensemble getEnsemble();
    	private:
    		Ensemble unEnsemble;
    };
    Dans le .cpp
    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
     
    EnsembleTest::EnsembleTest()
    {	
    };
     
    set<Test>::iterator EnsembleTest::getDebut()
    {
    	return this->unEnsemble.begin();
    };
     
    set<Testt>::iterator EnsembleTest::getFin()
    {
    	return this->unEnsemble.end();
    };
     
     
    Ensemble EnsembleDePoints::getEnsemble()
    {
    	return this->unEnsemble;
    };
    Je n'ai pas mis toutes la classe, mais la partie problématique. J'ai comme l'impression que c'est à cause de "set" que cela ne fonctionne pas ... ou il me manque un include ...

    Merci
    a+


  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Par défaut
    Il aurait fallu que tu montres le fichier .h de ta classe "Test", ainsi qu'un extrait de tes messages d'erreur (au moins le début).

    Celle-ci doit en particulier implémenter un opérateur "inférieur à" pour permettre la comparaison des clés du "set".
    Est-ce le cas ?

    N'oublie pas non plus les problèmes d'espace de nom.
    Il est possible que tu doives écrire : std::set (alors que dans ton code original il y avait peut-être un "using namespace std")

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Par défaut
    Salut,

    Oui, j'ai implémenter un opérateur "inférieur à" que j'ai mis dans le .h également.
    Le .h que j'ai montré est celui de test (test.h)

    Pour les erreurs :
    C2143: erreur de syntaxe : absence de ';' avant '<'
    error C2501: 'Ensemble::set' : Spécificateurs de type ou de classe de stockage manquants
    error C2039: 'iterator' : n'est pas membre de 'operator``global namespace'''


    ici
    set<Point>::iterator getDebut();

    Merci
    a+

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Par défaut
    Désolé mais ce n'est pas clair.
    La classe que tu montres ne s'appelle pas "Test" mais "EnsembleTest".

    Sans autre précision (et en particulier sans les includes), difficile de porter un diagnostic.
    Les messages d'erreur n'apportent pas grand chose sans le code qui leur correspond.

    J'imagine que ton programme original compilait. Il faudrait que tu précises un peu plus en détail comment tu as réalisé le découpage et que tu montres des exemples de code plus complets.

    On pourra reprendre ça demain (et avec des gens mieux inspirés que moi)

    Bonne nuit

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 109
    Par défaut
    Salut,

    Je me doutais que le problème serait dur à saisir. J'ai donc fait un petit projet avec 2 fichiers où j'essaie de démontrer le problème.

    Je mis en pièce-jointes Test.zip. Le projet a été créer avec visual c++ et compile avec des erreurs.

    J'ai également mis en pièce-jointes Fonctionnel.zip qui lui compile.

    En somme, si j'arrive à faire compiler ce qui se trouve dans Test.Zip, mon problème est résolu!

    Il n'est pas nécessaire de regarder la qualité du code, car ce n'est qu'un exemple pour illustrer le problème.

    Merci!
    a+
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Kiboumz
    J'ai un gros programme en c++
    J'ai comme un doute vu la nature des problèmes que tu rencontres.


    Quand on sépare un programme en différente unités de compilation, il faut que dans chacune d'entre elles se trouvent les déclarations de tout ce qui y est utilisé. Dans ton exemple, c'est le cas de Principal.cpp mais pas de EnsembleTest.cpp: on y utilise std::set sans avoir inclus l'en-tête adéquat.

    Deuxièmement, une clause using namespace prend effet à partir du moment où elle est apparaît. Donc dans Principal.cpp et dans EnsembleTest.cpp -- même si tu y avais inclus <set> -- l'inclusion de EnsembleTest.h avant la clause fait que std::set n'y serait pas reconnu sans être qualifié par std::.

    Troisièmement, -- avant que tu ne te dises que tu vas régler le deuxième problème en mettant un using namespace dans EnsembleTest.h -- mettre un using std dans des en-têtes est une mauvaise idée dès qu'on sort de petits programmes jouets. On l'impose à tout ceux qui incluent le fichier: peu de gens sont au courant de tous les noms déjà utilisés dans std, le C++ permet à tout en-tête standard d'inclure n'importe quel autre, personne ne sait ceux qui le seront dans l'avenir, au total le conflit de noms est assuré d'arriver tôt ou tard.

    Quatrièmement, écrire des en-têtes qui dépendent du fait que certains noms ont été déclarés avant leur inclusion est une mauvaise idée. Il faut donc ajouter à EnsembleTest.h ce qu'il faut pour qu'il puisse être le premier fichier inclus dans une unité de compilation. Le meilleur moyen pour s'en assurer, c'est de le mettre comme premier fichier inclus dans l'unité de compilation qui définit ce qui est déclaré dans l'en-tête (donc EnsembleTest.cpp)

    Cinquièmement, quand on applique le point décrit en quatrièmement, on se retrouve à inclure (indirectement) plusieurs fois un même en-tête dans une seule unité de compilation. Cela pose des problèmes de définitions multiples. On place donc autour de chaque fichier inclus des gardes d'inclusion, c'est un petit jeu avec les macros qui s'assure que le contenu ne sera vu qu'une fois par le compilateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef FILE_NAME_INCLUDED
    #define FILE_NAME_INCLUDED
    ...
    #endif
    naturellement il faut remplacer FILE_NAME par le nom du fichier.

    Il doit y avoir d'autres choses, mais ça suffit pour le moment.

Discussions similaires

  1. [Débutant] séparer une fonction du reste du programme principal
    Par Angel30 dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 19/05/2009, 15h24
  2. Séparer la partie GUI du programme du reste
    Par geek-59600 dans le forum Débuter
    Réponses: 20
    Dernier message: 01/02/2009, 18h56
  3. séparer donné et programme
    Par qtipse dans le forum Modélisation
    Réponses: 1
    Dernier message: 08/04/2008, 04h27
  4. [VBS] séparer fonctions et programme
    Par loicos dans le forum VBScript
    Réponses: 2
    Dernier message: 17/01/2007, 13h48
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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