Débutant C++ - Intéractions d'objets de même nom

Débutant C++ - Intéractions d'objets de même nom - C++ - Programmation

Marsh Posté le 12-04-2005 à 10:07:41    

Bonjour à tous
comme je l'ai dit, je débute en C++ et j'ai un soucis soit conceptuel, soit de connaissances.
 
J'ai un projet en C++. Je l'ai découpé en plusieurs sources, chaque source étant dévolu à une fonction du projet.
Pour certaines fonctions, j'ai quelques trucs à faire. Je me dis que je peux utiliser un objet pour cela. Je défini donc dans le source de la fonction un objet "truc" (nom mis ici pour exemple) qui m'aidera dans l'algo du code de la fonction en question.
Le problème, c'est que j'ai mis le même nom d'objet dans plusieurs sources (avec des méthodes de même nom) et que ça plante à l'édition des liens (méthode xxx() déjà définie ailleurs).
Je pensais que l'objet défini dans un source "x" ne serait connu que dans ce source (un peu comme une fonction "static" ) mais apparemment, ce n'est pas le cas.
 
Donc est-ce que j'ai fait une faute de conception (par exemple on ne défini pas plusieurs objets de même nom dans un programme) ou bien il me manque quelque chose pour que mon idée réussisse ?
 
Merci

Reply

Marsh Posté le 12-04-2005 à 10:07:41   

Reply

Marsh Posté le 12-04-2005 à 10:19:08    

Sve@r a écrit :

Bonjour à tous
Donc est-ce que j'ai fait une faute de conception (par exemple on ne défini pas plusieurs objets de même nom dans un programme) ou bien il me manque quelque chose pour que mon idée réussisse ?


Oulà qu'est ce que tu appelles objet de meme nom ???
 
C'est le nom de la variable qui est identiqueou "le type" :

Code :
  1. class MonObjet
  2. {
  3.   //...
  4. };


 
Dans ce cas, oui, il ne peuty avaoir qu'une seule déclaration de la classe MonObjet. En effet si tu fais après

Code :
  1. MonObjet mon_tit_objet_a_moi ;
  2. MonObjet mon_tit_objet_aussi_a_moi;


 
Les méthodes de l'objet MonObjet s'applique à mon_tit_objet_a_moi et à mon_tit_objet_aussi_a_moi (c'est une totologie)
 
Snon, tu peux préciser ta question :o

Reply

Marsh Posté le 12-04-2005 à 11:25:40    

C'est pour ça qu'existe namespace
Met ton objet dans un namespace anonyme et voila :)
avec l'ex précédent :

Code :
  1. namespace
  2. {
  3.   class MonObjet
  4.   {
  5.     //...  
  6.   };
  7.   MonObjet mon_tit_objet_a_moi ; // local au fichier (comme avec static)
  8. }
  9. mon_tit_objet_a_moi = ...
  10. MonObjet mon_tit_objet_aussi_a_moi; // ici global


Message édité par Tarabiscote le 12-04-2005 à 11:27:16
Reply

Marsh Posté le 12-04-2005 à 11:31:49    

LordHarryPotter a écrit :

Oulà qu'est ce que tu appelles objet de meme nom ???
 
C'est le nom de la variable qui est identiqueou "le type" :


C'est le type
 
En fait, j'ai un source "a.cpp" contenant le code suivant

class truc {
    public:
    void affich(void);
};
 
void truc::affich(void)
{
    printf("Hello de A\n" );
}
 
void Fa(void)
{
    truc elem;
    elem.affich();
}


 
Puis j'ai un source "b.cpp"

class truc {
    public:
    void affich(void);
};
 
void truc::affich(void)
{
    printf("Hello de B\n" );
}
 
void Fb(void)
{
    truc elem;
    elem.affich();
}


 
Puis le main dans un fichier "pgm.cpp" qui englobe tout ça

void Fa(void);
void Fb(void);
int main(void)
{
   Fa();
   Fb();
   return(0);
}


 
Compilation
g++ -c pgm.cpp =>ok
g++ -c a.cpp =>ok
g++ -c b.cpp =>ok
g++ a.o b.o pgm.o -o pgm => erreur => truc::affich() déjà défini
 
Donc, comme je l'ai dit, je pensais que la classe "truc" du fichier "a.cpp" n'était connue que dans le fichier "a.cpp" et n'entrerait pas en intéraction avec la classe "truc" du fichier "b.cpp".
Où me suis-je trompé ? Dois-je utiliser des classes de noms tous différents ?

Reply

Marsh Posté le 12-04-2005 à 11:33:17    

Tarabiscote a écrit :

C'est pour ça qu'existe namespace
Met ton objet dans un namespace anonyme et voila :)
avec l'ex précédent :

Code :
  1. namespace
  2. {
  3.   class MonObjet
  4.   {
  5.     //...  
  6.   };
  7.   MonObjet mon_tit_objet_a_moi ; // local au fichier (comme avec static)
  8. }
  9. mon_tit_objet_a_moi = ...
  10. MonObjet mon_tit_objet_aussi_a_moi; // ici global



 
Ouah ! Je connaissais pas ! Merci

Reply

Marsh Posté le 12-04-2005 à 12:07:41    

Sve@r a écrit :

C'est le type
 
En fait, j'ai un source "a.cpp" contenant le code suivant

class truc {
    public:
    void affich(void);
};
 
void truc::affich(void)
{
    printf("Hello de A\n" );
}
 
void Fa(void)
{
    truc elem;
    elem.affich();
}


 
Puis j'ai un source "b.cpp"

class truc {
    public:
    void affich(void);
};
 
void truc::affich(void)
{
    printf("Hello de B\n" );
}
 
void Fb(void)
{
    truc elem;
    elem.affich();
}


 
Puis le main dans un fichier "pgm.cpp" qui englobe tout ça

void Fa(void);
void Fb(void);
int main(void)
{
   Fa();
   Fb();
   return(0);
}


 
Compilation
g++ -c pgm.cpp =>ok
g++ -c a.cpp =>ok
g++ -c b.cpp =>ok
g++ a.o b.o pgm.o -o pgm => erreur => truc::affich() déjà défini
 
Donc, comme je l'ai dit, je pensais que la classe "truc" du fichier "a.cpp" n'était connue que dans le fichier "a.cpp" et n'entrerait pas en intéraction avec la classe "truc" du fichier "b.cpp".
Où me suis-je trompé ? Dois-je utiliser des classes de noms tous différents ?


 
 
Les namespaces permettent d'avoir (dans des namespcaces différents) des objets de meme noms.
Bon engénéral t'as çà dans desgros projets.
 
Sinon dans ton main tu mets "void Fa();" tu saisà quoi serve les fichier .h ???
Les fichiers .h serve à déclarer des fonctions qui vont être définis dans de fichiers .cpp et qui peuvent être utiliser ailleurs, typiquement ta classe truc et surtout les fonctions Fa et Fb.
 
Sinon rien ne t'empêche d'inclure un char* dans ton objet truc ain d'éviter de redéfinir l'objet truc (dans lesdeux cas t'initialise la chaine de caractères pour qu'elle soit égale à héllo A ou héllo B)

Reply

Marsh Posté le 12-04-2005 à 12:15:39    

LordHarryPotter a écrit :

Les namespaces permettent d'avoir (dans des namespcaces différents) des objets de meme noms.
Bon engénéral t'as çà dans desgros projets.


Merci
 

LordHarryPotter a écrit :

Sinon dans ton main tu mets "void Fa();" tu saisà quoi serve les fichier .h ???
Les fichiers .h serve à déclarer des fonctions qui vont être définis dans de fichiers .cpp et qui peuvent être utiliser ailleurs, typiquement ta classe truc et surtout les fonctions Fa et Fb.


Vivi, j'ai été prof de C et je connais le principe du header :)
J'ai écris cet exemple simpliste pour résumer mon problème. En fait, dans les deux sources, l'objet "truc" n'est pas le même => chaque "truc" étant spécifique à chaque source il n'est pas à mettre dans un header
 

LordHarryPotter a écrit :

Sinon rien ne t'empêche d'inclure un char* dans ton objet truc ain d'éviter de redéfinir l'objet truc (dans lesdeux cas t'initialise la chaine de caractères pour qu'elle soit égale à héllo A ou héllo B)


Dans mon projet, mes objets de travail sont plus complexes. Et certains ne sont là que pour aider des fonctions précises à bosser => je vais tester le namespace

Reply

Sujets relatifs:

Leave a Replay

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