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 :

[deb.]Probleme de syntax decl de pl class


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut [deb.]Probleme de syntax decl de pl class
    Bonjour,
    je fais un exo ou je dois declare plusieures classes qui doivent travailler ensemble. Mais quand je veux integrer dans la deuxieme la decl d'un objet de la premiere le compilateur me donne une erreur de redefinition de class.

    Est-ce que quelqu'un peut me dire ou est la faute

    Ci-joint mes deux classes et le mes. d'erreur
    Classe 1
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include<iostream>
    using namespace std;
    class duree{
    private:
    /////////////////////////////
    //Decl. Variables de class
    //////////////////////////////       
            int nm;
            int ns;
     
    public:
    /////////////////////////////
    //Decl. Constructeur/Destructeur
    //////////////////////////////
     
    //Constructeur par defaut
                   duree(void);
     
    // IC = (int, int) Constructeur par initialisation
                   duree(int , int);               
     
    //Destructeur
                   ~duree(void);
     
    /////////////////////////////
    //Decl. Surcharge des Operateurs
    //////////////////////////////      
     
    //surcharge de l'operateur >>cin , Saisie pour objet duree
    friend istream& operator >> (istream&, duree& D);
     
    //surcharge de l'operateur <<cout, Affichage pour objet duree
    friend ostream& operator << (ostream&, const duree& D);
     
          };             // Fin de class duree
    Classe 2
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include<iostream>
    using namespace std;
    #include "duree.h"
     
    const int maxi = 30;         //Nb de char max
     
    class morceau{
    private:
    /////////////////////////////
    //Decl. Variables de class
    //////////////////////////////       
            char* t;
            duree d;   
     
    public:      
    /////////////////////////////
    //Decl. Constructeur/Destructeur
    //////////////////////////////
     
    //Constructeur par defaut
                   morceau(void);
     
    // IC = (char* ti, duree du) Constructeur par initialisation
                   morceau(char* ti, duree du);               
     
    //Destructeur
                   ~morceau(void);      
     
    /////////////////////////////
    //Decl. Surcharge des Operateurs
    //////////////////////////////      
     
    //surcharge de l'operateur >>cin, Saisie pour objet morceau 
    friend istream& operator >> (istream&, morceau& M);
     
    //surcharge de l'operateur <<cout, Affichage pour objet morceau
    friend ostream& operator << (ostream&, morceau& );      
     
     
          };       // Fin de decl de classe morceau
    Et ceci est le message d'erreur

    Compilateur: Default compiler
    Building Makefile: "C:\Dev-Cpp\Devoir_3\Makefile.win"
    Exécution de make...
    make.exe -f "C:\Dev-Cpp\Devoir_3\Makefile.win" all
    g++.exe -c testDev_3.1.cpp -o testDev_3.1.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    In file included from morceau.h:8,
    from testDev_3.1.cpp:11:
    duree.h:9: error: redefinition of `class duree'

    duree.h:9: error: previous definition of `class duree'

    make.exe: *** [testDev_3.1.o] Error 1

    Exécution terminée
    La classe duree fonctionne bien toute seule.

    D'avance merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu n'as pas entouré tes en-têtes de directives anti-réinclusion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef UN_NOM_UNIQUE_POUR_CHAQUE_FICHIER
    #define UN_NOM_UNIQUE_POUR_CHAQUE_FICHIER
     
    // Contenu de ton en-tête
    // ...
     
    #endif
    Voir également dans la FAQ

    http://c.developpez.com/faq/cpp/?pag...ASS_header_cpp

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Je n'avais pas encore vu cela jusque a maintenant merci pour la reponse

    J'ai essaye mais ce n'est pas encore ca

    J'ai pour mes classes
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Class_1
    #ifndef "duree"
    #define "duree"
    #include<iostream>
    using namespace std;
     
    class duree{
    private:
    /////////////////////////////
    //Decl. Variables de class
    //////////////////////////////       
            int nm;
            int ns;
     
    public:
    /////////////////////////////
    //Decl. Constructeur/Destructeur
    //////////////////////////////
     
    //Constructeur par defaut
                    duree();
     
    // IC = (int, int) Constructeur par initialisation
                    duree(int , int);               
     
     
          };             // Fin de class duree
    #endif
     
    Class_2
    #ifndef "morceau"
    #define "morceau"
    #include "duree.h"
    #include<iostream>
     
     
    using namespace std;
     
     
    const int maxi = 30;         //Nb de char max
     
    class morceau{
    private:
    /////////////////////////////
    //Decl. Variables de class
    //////////////////////////////       
            char* t;
            duree d;   
     
    public:      
    /////////////////////////////
    //Decl. Constructeur/Destructeur
    //////////////////////////////
     
    //Constructeur par defaut
                   morceau(void);
     
    // IC = (char* ti, duree du) Constructeur par initialisation
                   morceau(char* ti, duree du);               
     
     
          };       // Fin de decl de classe morceau
    #endif
    Mais j'ai aussi comme message d'erreur

    Exécution de make...
    make.exe -f "C:\Dev-Cpp\Devoir_3\Makefile.win" all
    g++.exe -c testDev_3.1.cpp -o testDev_3.1.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    In file included from testDev_3.1.cpp:10:
    morceau.h:6:9: macro names must be identifiers
    In file included from testDev_3.1.cpp:11:
    duree.h:6:9: macro names must be identifiers
    testDev_3.1.cpp: In function `int main()':

    testDev_3.1.cpp:19: error: `duree' undeclared (first use this function)

    testDev_3.1.cpp:19: error: (Each undeclared identifier is reported only once for each function it appears in.)

    testDev_3.1.cpp:19: error: expected `;' before "A"

    testDev_3.1.cpp:20: error: `A' undeclared (first use this function)

    make.exe: *** [testDev_3.1.o] Error 1

    Exécution terminée
    Que faire? Il ne cree pas d'objet de la classe duree, pourtant je fais le include "fileDemande"

    En suivant le main

    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
     
    #include <cstdlib>
    #include <iostream>
    #include<stdlib.h> // Pour system "Pause"
    #include "morceau.h"
    #include "duree.h"
    using namespace std;
     
    int main(void)
    {
     
     
    cout << "Saisie des donnees" <<endl;    
    duree A;                                 //Decl. duree A
    cin>>  A;                                //Saisie pour duree A   
    cout<< A;   
     
        system("PAUSE");
        return EXIT_SUCCESS;    
     
        }            //Fin main
    Comment est ce que je dois corrige cela?

    marc_3

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    De nouveau moi et je viens de trouver la faute de syntax pour les elements suivant:
    #ifndef _duree_H_
    #define _duree_H_
    Il me reste par contre necore une faute dans mon constructeur par init


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Impl. construc. par init.
            morceau::morceau(char* ti, duree du){
                               t = ti;
                                     duree = du;  //La ligne 24 est ici
                                     };
    J'ai cette erreur avec
    Compilateur: Default compiler
    Building Makefile: "C:\Dev-Cpp\Devoir_3\Makefile.win"
    Exécution de make...
    make.exe -f "C:\Dev-Cpp\Devoir_3\Makefile.win" all
    g++.exe -c morceauImpl.cpp -o morceauImpl.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include"

    morceauImpl.cpp: In constructor `morceau::morceau(char*, duree)':
    morceauImpl.cpp:24: error: expected primary-expression before '=' token

    make.exe: *** [morceauImpl.o] Error 1

    Exécution terminée
    Est ce que quelqu'un peut me donner une idee pour ca?

    D'avance merci

  5. #5
    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 Marc_3
    De nouveau moi et je viens de trouver la faute de syntax pour les elements suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Impl. construc. par init.
            morceau::morceau(char* ti, duree du){
                               t = ti;
                                     duree = du;  //La ligne 24 est ici
                                     };
    Le probleme est que duree c'est un type. Tu devrais plutot mettre le nom du membre que tu veux initialiser.

    Ceci dit, quelques remarques:
    • mets des noms explicites
    • pour initialiser les membres, il faut mieux utiliser la syntaxe prevue pour plutot que de les laisser avec une construction par defaut suivi d'une affectation. Donc
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      morceau::morceau(char* titre, duree laDuree)
         : monTitre(titre), maDuree(laDuree)
      {
      }
    • est-ce que tu veux vraiment modifier la chaine pointer par ti? A priori, non, donc il aurait fallu passe un char const* et non un char*
    • est-ce que tu as une bonne raison d'utiliser des char (const)* plutot que des std::string?

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    J'ai a peu pres compris ce que tu me dis mais pas tout.

    Pour ce qui est du pointeur sur la chaine de carac. c'est demande dans l'exo.
    Pour ce qui est du passage d'un objet je ne sais pas trop ce que je dois faire. Il y a quelque chose qui m'echappe.

    J'ai tenu compte de tes remarques et fais quelques correction et maintenant mon code est compile .

    Les corrections ont cette allure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Impl. construc. par init.
            morceau::morceau(char* ti, duree du){
                               char* pointeur = ti;
                               duree dur = du;
                                     };
    J'obtiens donc un objet morceau qui a pour composantes un pointeur sur un tableau de char et une variable de type duree qui elle meme renferme des minutes et des secondes.

    Est-ce que cela est juste?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Là tu définis localement à ton constructeur deux variables (pointeur et dur), lesquelles seront détruites dès la fin de ce constructeur.

    Je pense que ce que tu veux faire, c'est plutôt assigner les paramètres reçus (ti et du) aux données membres de ta classe, à savoir t et d.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    morceau::morceau(char* ti, duree du)
    {
        t = ti;
        d = du;
    } // <- pas besoin de ;

  8. #8
    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 Marc_3
    Pour ce qui est du pointeur sur la chaine de carac. c'est demande dans l'exo.
    Alors char const* et pas char*.

    Pour ce qui est du passage d'un objet je ne sais pas trop ce que je dois faire. Il y a quelque chose qui m'echappe.
    Tu avais ecritou duree est un type. Il fallait remplacer "duree" par le nom du membre (d).

    Les corrections ont cette allure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     morceau::morceau(char* ti, duree du){
                               char* pointeur = ti;
                               duree dur = du;
                                     };
    C'est moins bon que precedemment. Ici tu declares des variables locales au constructeur et tu n'initialises pas les membres. Je redonne ce que j'ecrirais avec tes n oms cette fois-ci (et en remplacant char* par char const*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    morceau::morceau(char const* ti, duree du)
       : t(ti), d(du)
    {
    }

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Merci pour les reponses, pas trop vite quand meme je ne vais pas y arrive

    Je commence avec Jean-Marc

    Je suis desole je suis perdu. Je ne connais (pas encore) la syntax que tu utilise et son effet.
    Jusque ici j'ai suppose que monTitre() et maDuree() faisaient office de setter cad qu'ils initialisent les membres de la classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    morceau::morceau(char* titre, duree laDuree)
       : monTitre(titre), maDuree(laDuree)
    {
    }
    J'etais en train d'essayer de faire la meme chose en tout cas dans mon idee avec mon bricolage.
    Qui a l'air de marche apres les corrections de loulou24 ainsi que tes bon soins prodigues presque en meme temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Version Loulou
     
    morceau::morceau(char* ti, duree du)
    {
        t = ti;
        d = du;
    } // <- pas besoin de ; merci pour celle la aussi
     
    Version Jean-Marc
    morceau::morceau(char const* ti, duree du)
       : t(ti), d(du)
    {
    }
    En fait il faudrait juste si je suis ssur la bonne piste parsque en tout cas cote compilateur pas de protestation. Et je vais continue comme ca

    Merci pour tout

    marc_3

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ton constructeur paraît correct.

    Par contre, es-tu bien sûr de juste vouloir recopier le pointeur sur la chaîne, et non la chaîne en elle-même (ie. si la chaîne originale est modifiée ou détruite, le pointeur que tu auras dans les instances de ta classe sera invalide) ?

  11. #11
    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 Marc_3
    Merci pour les reponses, pas trop vite quand meme je ne vais pas y arrive

    Je commence avec Jean-Marc

    Je suis desole je suis perdu. Je ne connais (pas encore) la syntax que tu utilise et son effet.
    C'est toujours un problème quand on répond à des apprenants... non seulement il faut se limiter à ce qu'ils savent mais il faut parfois deviner ce qu'ils ignorent encore... non qu'ils en peuvent mais. Et on peut en plus considérer que l'ordre de présentation choisi par certains n'est pas le meilleur... :-)
    Jusque ici j'ai suppose que monTitre() et maDuree() faisaient office de setter cad qu'ils initialisent les membres de la classe.
    Non, monTitre et maDuree était une suggestion de nom (le préfixe mon est une convention de nommage pour les membres non statique).

    En fait il faudrait juste si je suis ssur la bonne piste parsque en tout cas cote compilateur pas de protestation. Et je vais continue comme ca.
    La chose qui me gène le plus est l'utilisation de char* là où je mettrais des char const* (ou des const char* ce qui revient au même). Mais si tu ne les as pas vu...

    Ensuite il y a le problème que la durée de vie du pointeur va vraissemblablement être difficile à contrôler par l'appelant. Mais c'est vraissemblablement pour plus tard.

  12. #12
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Ok voila je continue comme cela et je vais faire avec pour le moment parsque les questions debordent. Je vais ferme cette question et en ouvrir une autre car les manques de celle-ci ont apparement des consequences sur la suite de mon boulot. Entre autre l'utilisation des const qui est mon probleme suivant par ordre d'arrivee

    @+ et merci

    marc_3

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

Discussions similaires

  1. [2.x] probleme de syntaxe avec une classe
    Par adel25 dans le forum Symfony
    Réponses: 1
    Dernier message: 01/09/2013, 22h39
  2. [Deb]Syntax decl d'une const
    Par Marc_3 dans le forum C++
    Réponses: 3
    Dernier message: 03/02/2006, 08h27
  3. Réponses: 4
    Dernier message: 04/12/2005, 15h33
  4. Réponses: 14
    Dernier message: 04/12/2005, 08h08
  5. Problemes de syntaxe
    Par maahta dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 01/10/2003, 13h40

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