[ C++ ] Un projet, 3 fichiers, #include et ou c'est que je me gourre ?

Un projet, 3 fichiers, #include et ou c'est que je me gourre ? [ C++ ] - C++ - Programmation

Marsh Posté le 18-03-2004 à 17:37:44    

Attention, l'erreur qui va suivre est probablement stupide, alors si vous avez eu une mauvaise journee et manquez de patience, passez votre chemin [:dawa]
 
J'essaye de compiler un chti prog compose des 3 fichiers suivants :
 
main.cpp

Code :
  1. #include <iostream>
  2. #include "locales.h"
  3. int main(){
  4.   std::cout << ".:The Core File Library:." << std::endl;
  5.   Entry MyEntry;
  6.   std::cout << MyEntry.GetValue() << std::endl;
  7.   Entry MyEntry2(12,"test" );
  8.   std::cout << MyEntry2.GetValue() << std::endl;
  9.   return 0;
  10. }


 
locales.h

Code :
  1. #include <string>
  2. class Entry
  3. {
  4. private:
  5.     int id;
  6.     std::string name;
  7. public:
  8.     Entry();
  9.     Entry(int id_, std::string name_);
  10.     std::string GetValue();
  11. };


 
locales.cpp

Code :
  1. #include "locales.h"
  2. Entry::Entry(){
  3.   id=0;
  4.   name="no name";
  5. }
  6. Entry::Entry(int id_, std::string name_){
  7.   id=id_;
  8.   name=name_;
  9. }
  10. string Entry::GetValue{}{
  11.   return id << "-" << name;
  12. }


 
le message d'erreur du compilateur (g++) est  


/tmp/ccp9ApzV.o(.text+0x3c): In function `main':
: undefined reference to `Entry::Entry[in-charge]()'
/tmp/ccp9ApzV.o(.text+0x4e): In function `main':
: undefined reference to `Entry::GetValue()'
collect2: ld returned 1 exit status
zsh: exit 1     g++ -o test.exe test.cpp


 
Je ne comprends pas pourquoi la reference a Entry::Entry n'est pas definie. Et ce [in charge], il vient d'ou  :sweat:


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 18-03-2004 à 17:37:44   

Reply

Marsh Posté le 18-03-2004 à 18:01:44    

c'est quoi ce .exe :o
 
g++ -W -Wall -std=c++98 -pedantic test.cpp locales.cpp -o test
./test

Reply

Marsh Posté le 18-03-2004 à 18:06:28    

faisons un peu mieux au niveau du code
 

Code :
  1. // locales.h
  2. #ifndef CILER_LOCALES_H
  3. #define CILER_LOCALES_H
  4. #include <string>
  5.  
  6.   class Entry
  7.   {
  8.      private:
  9.         int id;
  10.         std::string name; 
  11.      public:
  12.         Entry(int id_ = 0, const std::string &name_ = "no name" );
  13.         std::string GetValue()const;
  14.   };
  15. #endif // CILER_LOCALES_H


 
 

Code :
  1. #include "locales.h"
  2. #include <sstream>
  3.  
  4.   Entry::Entry(){
  5.       id=0;
  6.       name="no name";
  7.   }
  8.  
  9.   Entry::Entry(int id_, const std::string &name_)
  10.     : id(_id), name(name_) {
  11.   }
  12.  
  13.   string Entry::GetValue{} const {
  14.     std::ostringstream ost;
  15.     ost << id << '-' << name;
  16.     return ost.str()
  17.   }

Reply

Marsh Posté le 18-03-2004 à 18:15:16    

Taz a écrit :

c'est quoi ce .exe :o


C'est pour du multiplateforme  :whistle:  
 

Taz a écrit :


g++ -W -Wall -std=c++98 -pedantic test.cpp locales.cpp -o test
./test


 [:le velocypede de zed] Si je ne fais pas compiler locales.cpp en effet il pourrait y avoir un probleme  :D  
Quand au -W -Wall -std=c++98 -pedantic comme ca n'est certainement pas la pour faire joli, on va voir ce que man en pense.
 
Par contre pour tes modifications... Aurais-tu l'obligence de m'expliquer leurs objectif de facon plus detaille ? J'ai deja vu passer le coup des #ifndef #define qque part (en cherchant sur un autre sujet) mais ca ne m'a pas laisse un souvenir imperissable.
 
Enfin :

Code :
  1. Entry::Entry(int id_, const std::string &name_)
  2.    : id(_id), name(name_) {
  3. }


J'ai jamais vu ca nulle part comme presentation [:wam]. Ca sort d'ou ?
 
 
Ah euh ... et merci au fait :jap:


Message édité par Ciler le 18-03-2004 à 18:15:39

---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 18-03-2004 à 18:28:55    

quand l'accolade de ton constructeur s'ouvre, __tous__ les membres sont déjà construits.
 
donc on prends par exemple ton membre name.
 
ta version à toi elle équivaut à
 
std::string name;
name = "machin"
 
tu vois tout de suite que
 
 
std::string name("machin" ) ça serait mieux :D
 
donc la notation que tu vois, c'est pour controler la construction des membres. et ça te permet aussi d'initialiser des membres qui n'ont pas de constructeurs par défaut ou qui sont constants

Reply

Marsh Posté le 18-03-2004 à 18:31:06    

Vu :jap:


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 18-03-2004 à 18:35:05    

et comme tu vois, ça t'évite de faire des opérations inutiles

Reply

Marsh Posté le 18-03-2004 à 18:39:27    

Je vois je vois.


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 27-03-2004 à 18:10:03    

Taz a écrit :

faisons un peu mieux au niveau du code
 

Code :
  1. // locales.h
  2. #ifndef CILER_LOCALES_H
  3. #define CILER_LOCALES_H
  4. #include <string>
  5.  
  6.   class Entry
  7.   {
  8.      private:
  9.         int id;
  10.         std::string name; 
  11.      public:
  12.         Entry(int id_ = 0, const std::string &name_ = "no name" );
  13.         std::string GetValue()const;
  14.   };
  15. #endif // CILER_LOCALES_H


 


 
AU sujet de l'utilisation de #ifndef #define #endif, je pense avoir compris l'explication ( http://www.fredosaurus.com/notes-c [...] ifdef.html [:petrus75] ) par contre un detail me chagrine, le _H a la fin du nom, c'est necessaire ou juste une convention ?


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 27-03-2004 à 19:05:54    

tu peux mettre ce que tu veux : la seule chose c'est qu'il faut que le symbole soit suffisemment unique pour éviter des collisions (je crois que tous les programmeurs ont un jour écris un Stack.h alors va pas mettre STACK_H)
 
comme il peut pas y avoir de . on mets des _
un bon compromis est un mélange nomde fichier / date / nom de projet / etc
 
d'ou mon CILER_LOCALES_H

Reply

Marsh Posté le 27-03-2004 à 19:05:54   

Reply

Marsh Posté le 27-03-2004 à 19:32:56    

Taz a écrit :

tu peux mettre ce que tu veux : la seule chose c'est qu'il faut que le symbole soit suffisemment unique pour éviter des collisions (je crois que tous les programmeurs ont un jour écris un Stack.h alors va pas mettre STACK_H)
 
comme il peut pas y avoir de . on mets des _
un bon compromis est un mélange nomde fichier / date / nom de projet / etc
 
d'ou mon CILER_LOCALES_H


Compris  :)  
 
Une autre question (j'ai pas mon Stroustup sous la main :o)
La dedans :

Code :
  1. class Entry
  2. {
  3.     private:
  4.        int id;
  5.        std::string name; 
  6.     public:
  7.        Entry(int id_ = 0, const std::string &name_ = "no name" );
  8.        std::string GetValue()const;
  9. };


Si je veux remplacer la string par une map, il y a moyen de faire l'affectation directement ? (un equivalent de = "truc" pour les maps)


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 27-03-2004 à 19:45:45    

quoi ?

Reply

Marsh Posté le 27-03-2004 à 19:51:52    


POur initialiser un string, on peut faire

Code :
  1. string foo="bar";


 
Peut-on faire quelque chose de comparable avec un map ?
genre

Code :
  1. map<int,string> foo=[1,"foo";2,"bar"];


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Marsh Posté le 27-03-2004 à 19:59:50    

non, tu ne peux pas.
 
 
string foo="bar"; -> string foo("bar" );

Reply

Marsh Posté le 27-03-2004 à 20:16:57    

Taz a écrit :

non, tu ne peux pas.


Dommage :'(
 

Taz a écrit :


string foo="bar"; -> string foo("bar" );


Sir Yes Sir ! (dur dur d'apprendre  :sweat: )


---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed