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 :

probleme avec Assign


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 14
    Par d�faut probleme avec Assign
    j`ai voulu compiler ce source mais m`apparu : syntax error : missing ')' before type 'char' et voila le code :

    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
     #include<iostream.h>
    #include<iomanip.h>
    #include<string.h>
     
    class Book 
    {
    public:
     
    	  char title[256];
    	  char author[64];
    	  float price;
    	  /*----(2)----*/
    	  void show_title() ; 
     
     
          /*--(@)--*/
    	  void show_book() ;  
     
     
     
     
    	 /*-----(3)----*/     
    private:
     
    	char publisher[256];
    	void show_publisher(char *name) ;
     
    };
     
    /*------(1)----*/
    void Book::show_book ()
    {
       show_title();show_publisher(char *name);
    } 
     
    /*------(2`)----*/
    void Book::show_title()
    {
    	cout<<title<<endl;
    }
    /*--------(3`)----*/
     
    void Book::show_publisher(char *name)
    {
    	strcpy(publisher,"nouvelle collection");
    	cout<<publisher<<endl;
    }
    /*-----------------*/
     
     
    void main()
    {
     
    Book primer;
     
    strcpy(primer.title, "C/C++ primery i zadachi");
     
     
    primer.show_book(); 
     
    }
    et a la fin doit aparaitre a l`ecran :
    C/C++ primery i zadachi
    nouvelle collection
    press any key to continue

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    D�tails du profil
    Informations personnelles :
    �ge : 52
    Localisation : France, C�te d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par d�faut
    Citation Envoy� par vitia Voir le message
    j`ai voulu compiler ce source mais m`apparu : syntax error : missing ')' before type 'char'
    Euh... es-tu s�r que c'est la seule erreur de syntaxe qui est apparue?

    Moi j'aurais plut�t utilis� comme headers:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #include<iostream>
    #include<string.h>
    J'aurais rajout� un Et je n'aurais mis aucun argument � la fonction show_publisher() puisqu'elle n'utilise pas celui qu'elle a actuellement. Du coup, l'erreur de syntaxe concernant le char, dans l'appel de la fonction, aurait disparu.

    Et �a aurait en effet imprim�
    C/C++ primery i zadachi
    nouvelle collection

    Mais j'aurais aussi utilis� des std::string plut�t que des char*! Et j'aurais rendu tous les champs priv�s ou tous publics, mais �a c'est peut-�tre plus subjectif.

  3. #3
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par d�faut
    Citation Envoy� par Biozic Voir le message
    Moi j'aurais plut�t utilis� comme headers:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #include<iostream>
    #include<string.h>
    Moi j'aurais m�me utilis�:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #include<iostream>
    #include<cstring>
    Et +1 pour std::string. Mais au moins, si tu fais des chaines C-style de taille fixe, utilise les fonctions C s�curis�es, comme strncpy... http://www.cplusplus.com/reference/clibrary/cstring/
    Sans compter qu'il n'y a que deux fa�ons de passer une chaine de caract�re c-style � une fonction:
    - un char* + un size_t pour indiquer la taille du buffer
    - un const char*
    Jamais un char* seul.

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut, et bienvenue sur le forum, vita...

    Allons, messieurs, s'il vous plait...

    Nous sommes sur le forum C++ et il se fait qu'il a �t� normalis� depuis longtemps et que la norme en vigueur est suffisemment vieille pour que la grosse majorit� des compilateurs r�cents respectent cette norme, du moins, au niveau des conventions de noms de fichiers.

    Si l'on pouvait donc vous demander d'au moins essayer de fournir directement les bonnes habitudes aux nouveaux, ce serait franchement simpa

    Vita:

    Il est fortement d�conseill� d'utiliser les chaines de caract�res "C style" (c'est � dire, des tableaux de caract�res termin�s par un '\0') en C++.

    Il existe, en effet, une classe particuli�rement adapt�e � la gestion des chaines de caract�res: la classe string, disponible dans l'espace de nommage std par inclusion du fichier <string> (remarque l'absence de ".h" )

    Cette classe s�curise tr�s fortement tout ce qui peut se rapporter � la gestion de chaine: ajout, suppression, modification, copie et s'adapte parfaitement � la gestion de flux (que ce soit les flux standard cin/cout, les flux "fichier" ifstream/ofstream ou meme les flux de conversion (i/o)stringstream) et t'�vitera les probl�mes li�s au fait de vouloir mettre 11 caract�res dans une chaine qui ne peut en contenir que... 10...

    Elle permet en outre de disposer, en cas de besoin, d'une chaine de caract�res "C style" via la m�thode c_str() (mais, en pratique, les cas dans lesquels il faille r�ellement passer par une chaine C style sont relativement limit�s )

    La d�finition de ta classe deviendrait alors
    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
    /* à l'origine
    #include<iostream.h>
    #include<iomanip.h>   heuu... quelle utilité ici ???
    #include<string.h>
     */
    #include <iostream>
    #include <string>
    class Book 
    {
        public:
            /* l'origine
            char title[256]; et si un titre fait plus de 255 caractères ???
            char author[64]; et si l'auteur fait plus de 64 caractère ???
            */
            /* Nota: Il y a de fortes chances pour que le titre et l'auteur
             * d'un livre donné reste immuable une fois que l'on a créé la 
             * référence concernant ce livre...
             *
             * Il serait donc clairement utile de  déclarer title et author comme
             * étant privés, de fournir un constructeur prenant deux chaines
             * en paramètres (une pour title et l'autre pour author), et de fournir
             * des fonctions constantes permettant, le cas échéant, de récupérer
             * le titre et le nom de l'auteur, en en interdisant la modification
             */
            std::string title;
            std::string author;   
    	  float price;
    	  /*----(2)----*/
    	  void show_title() ; 
     
          /*--(@)--*/
    	  void show_book() ;  
     
    	 /*-----(3)----*/     
        private:
            /* à l'origine
            char publisher[256]; toujours le meme problème
            void show_publisher(char *name) ;
            */
            std::string publisher;
            void show_publsher(const std::string& name);
     
    };
    D'un point de vue purement syntaxique...
    Quand tu en arrive � �crire un code du genre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void Book::show_book ()
    {
       /*...*/
    }
    tu en est � la d�finition (impl�mentation) de la m�thode (ici show_book) pour ce qui concerne ta classe (ici Book)...

    La seule chose que tu puisse faire, c'est appeler �ventuellement d'autres fonctions, or, quand on voit ton code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    void Book::show_book ()
    {
        /* j'ai mis la deuxième à la ligne, par simple habitude et pour la lisibilité*/
        show_title();/* OK, tu appelle bien une fonction */
        show_publisher(char *name);/* NOK: tu fournis un prototype pour une
                                    * fonction... 
                                    */
    }
    Comme l'indique les commentaires, tu fournis un prototype (quelque chose qui pourrait s'approcher d'une tentative de d�claration) pour la fonction show_publisher...

    Or, comme indiqu� plus haut, tout ce que tu peux faire, c'est appeler une fonction, et, surement pas te contenter de fournir un prototype

    D�s lors, il faudra disposer d'une variable du type correspondant au param�tre attendu par cette fonction (un char* si tu n'a pas modifi� ta classe, *id�alement* une std::string si tu a eu la clairvoyance de modifier ta classe comme je l'ai indiqu� )

    Tu auras trois solutions:

    1. Soit, tu dis que la fonction show_book doit, elle aussi, prendre ce param�tre, et il faut alors veiller � l'appeler en fournissant une chaine de caract�res utilisable comme param�tre pour show_publisher,

      Cela donnerait un code proche de
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      1
      2
      3
      4
      5
      6
      7
      /* Attention, il faudra modifier dans la classe le prototype de
      * show_book en void show_book(const std::string& name) */
      void Book::show_book(const std::string& name)
      {
          show_titre();
          show_publisher(name);
      }
    2. Soit tu demande la chaine � passer en parametre au sein de la fonction, ce qui donne le code
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      /* ici, pas besoin de modifier le prototype de show_book */
      void Book::show_book()
      {
          show_titre();
          std::string topass;
          std::cout<<"introduisez le nom de l'editeur :";
          cin>>topass;
          show_publisher(topass);
      }
    3. Soit, enfin, et c'est la meilleur solution, tu estimes que l'�diteur sera, lui aussi constant pour chaque livre, et tu le fournis directement dans le constructeur de ta classe, en ne fournissant que des m�thodes constantes pour y acc�der...

      Cette derni�re solution est la plus correcte, mais elle n�cessite alors de revoir enti�rement la d�finition de ta classe en quelque chose proche de
      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
       
      class Book
      {
          public:
              Book(const std::string&, const std::string&, const std::string&, float);
              ~Book();/*meme s'il ne fait rien, j'ai pris l'habitude de systématiquement
                      * définir le destructeur :D
                      */
              void show_book() const; /* affiche toutes les informations */
              void show_title() const; /* affiche uniquement le titre */
              void show_author() const; /* affiche uniquement l'auteur */
              void show_publisher() const; /* affiche uniquement l'éditeur */
              void show_price() const; /*affiche uniquement le prix */
              void modify_price(float);/* le prix peut évoluer au fil du temps... 
                                       * il semble donc de bon ton de pouvoir le modifier :D
                                       */
              /* on préférera souvent les méthodes
               * const std::string& GetTitle() const; qui renvoie le titre 
               *                                      (non modifiable)
               * const std::string& GetAuthor() const; qui renvoie l'auteur
               *                                       (non modifiable)
               * const std::string& GetPublisher() const; qui renvoie l'éditeur
               *                                          (non modifiable)
               *float GetPrice() const; qui renvoie le prix
               */ 
          private:
              std::string title;
              std::string author;
              std::string publisher;
              float price;
      };
      et l'on aurait alors les impl�mentations sous la forme de
      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
      /* penses à utiliser les listes d'initialisation dans le constructeur (comme fait
       * ici :D)
       */
      Book::Book(const std::string& title, const std::string& author, std::string&
                 publisher, float price):title(title),author(author),publisher(publisher),
                 price(price
      {
      }
      /* comme indiqué, le destructeur ne fait rien... mais j'aime autant
       * l'implémenter quand meme :D
       */
      Book::~Book()
      {
      }
       
      void Book::show_book() const
      {
          std::cout<<"Titre :"<<titre<<std::endl 
                   <<"Auteur :"<<auteur<<std::endl
                   <<"Editeur : "<<publisher<<std::endl
                   <<"Prix :"<<price<<std::endl;
      }
       
      void  Book::show_title() const
      {
          std::cout<<"Titre :"<<title<<std::endl;
      }
      void  Book::show_author() const
      {
          std::cout<<"Auteur :"<<author<<std::endl;
      }
      void  Book::show_publisher() const
      {
          std::cout<<"Editeur:"<<publisher<<std::endl;
      }
      void  Book::show_price() const
      {
          std::cout<<"Prix :"<<price<<std::endl;
      }
      void  Book::modify_price(float price)
      {
          price=newprice;
      }


    L'utilisation de cette classe se ferait sous la forme de
    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
    int main()
    {
        Book monlivre("le titre du livre", "l'auteur du livre", "l'editeur du livre",29.95);
        std::cout<<"affichage des informations completes "<<std::endl; 
        monlivre.show_book();
        std::cout<<"affichage du titre "<<std::endl;
        monlivre.show_title();
        std::cout<<"affichage de l'auteur"<<std::endl;
        monlivre.show_author();
        std::cout<<"affichage de l'editeur"<<std::endl;
        monlivre.show_publisher();
        std::cout<<"affichage du prix"<<std::endl;
        monlivre.show_price();
        /* avec les méthodes "Get..." cela prendrait la forme de
        std::cout<<"Titre :"<<monlivre.GetTitle()<<std::endl 
                 <<"Auteur :"<<monlivre.GetAuthor()<<std::endl
                 <<"Editeur : "<<monlivre.GetPublisher()<<std::endl
                 <<"Prix :"<<monlivre.GetPrice()<<std::endl;
        */
        return 0;
    }
    Voil�... tu pourras te vanter de m'avoir une fois de plus pouss� � �crire un roman... Mais je te rassure, cela arrive r�guli�rement
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  5. #5
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    Si l'on pouvait donc vous demander d'au moins essayer de fournir directement les bonnes habitudes aux nouveaux, ce serait franchement simpa
    Holala, on passe nos journ�es � r�peter "utilise std::string", moi je disais juste que tant qu'� utiliser la mauvaise solution, autant le faire correctement .

  6. #6
    Membre �prouv�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    D�tails du profil
    Informations personnelles :
    �ge : 52
    Localisation : France, C�te d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par d�faut
    Ah oui, mais on l'a dit tellement moins bien que le chef! Respect!

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    A vrai dire, j'ai pris l'habitude de regarder le nombre de messages de la personne qui pose la question, surtout quand il apparait que la question traite de quelque chose que l'on peut consid�rer comme "aussi basique" que le fait de pr�f�rer la std::string au tableaux de caract�res.

    Ici, vitia est visiblement la personne qui
    1. d�barque sur le forum
    2. commence � peine � approcher le C++


    (@Vitia==> Ce n'est absolument pas un grief, ce n'est qu'une constatation qu'il ne faut aucunement prendre mal: on est tous pass�s par la (m�me si certains on tendance � l'oublier) )

    Dans de telles circonstances, et m�me si on a l'impression de jouer les perroquets, le mieux est toujours de r�p�ter une fois de plus

    Apres tout: faire et d�faire, c'est toujours travailler
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

Discussions similaires

  1. Probleme avec assign dans BPEL
    Par khaled69100 dans le forum Services Web
    R�ponses: 1
    Dernier message: 21/12/2008, 20h07
  2. probleme avec vector.assign
    Par jahmanzaar dans le forum D�buter
    R�ponses: 1
    Dernier message: 29/10/2008, 22h45
  3. probleme avec : record "new" is not assigned yet D
    Par chtieu dans le forum PostgreSQL
    R�ponses: 2
    Dernier message: 31/03/2005, 20h44
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    R�ponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    R�ponses: 4
    Dernier message: 08/06/2002, 23h06

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