Probleme avec constructeur surchargé

dr971 Messages postés 27 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007 - 3 avril 2007 à 20:23
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 4 avril 2007 à 16:53
Bonjour je programme un simulateur de course auto en c++ et j'ai un gro prob avec mes classes.
en fait j'ai 2 classes :

//classe voiture :
#ifndef VOITURE_H
#define VOITURE_H

#include "Obstacle.h"
/*
* No description
*/
class Voiture
{
public:

...

// class constructor
Voiture();
// class destructor
~Voiture();

private:

Obstacle m_obstacleEnCours;
Obstacle m_Ligne_droite(1 , "Ligne droite" , 0);

};

#endif // VOITURE_H

Une classe Obstacles :

#ifndef OBSTACLE_H
#define OBSTACLE_H

/*
* No description
*/
class Obstacle
{
public:

// surcharge constructeur
Obstacle(int iden ,std::string nom , int effet);
// class constructor
Obstacle();
// class destructor
~Obstacle();

private:

//Attributs
std::string m_nom_obstacle;
int m_identifiant;
int m_effet;

};

#endif // OBSTACLE_H

Dans obstacle.cpp j'ai :
#include <string>
#include "Obstacle.h" // class's header file

using namespace std;

// class constructor
Obstacle::Obstacle() : m_identifiant(0) , m_effet(0) , m_nom_obstacle("obstacle_par_defaut")
{

}

// surcharge constructeur
Obstacle::Obstacle(int iden ,string nom , int effet) : m_identifiant(iden) , m_nom_obstacle(nom) , m_effet(effet)
{
}
// class destructor
Obstacle::~Obstacle()
{
}

Mon probleme est que lorsque je défini ma variable m_obstacleEnCours avec le constructeur simple mon prog l'accepte et compil mais lorsque ke je défini Obstacle m_Ligne_droite(1 , "Ligne droite" , 0) il ne compil pas. Je ne vois pas mon erreur.

Pourriez vous m'aider svp? merci d'avance.

8 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
3 avril 2007 à 21:13
Ton compilo te donne forcément un message d'erreur. Sans lui, on pourra pas t'aider.
0
dr971 Messages postés 27 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007
3 avril 2007 à 21:42
Voila la reponse ke mon donne le compilateur :

Compilateur: Default compiler
Building Makefile: "C:\Documents and Settings\Propriétaire\Bureau\tp c++ V3\Makefile.win"
Exécution de  make...
make.exe -f "C:\Documents and Settings\Propriétaire\Bureau\tp c++ V3\Makefile.win" all
g++.exe -c voiture.cpp -o voiture.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 voiture.cpp:5:
Voiture.h:61: error: expected `;' before '(' token


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


Exécution terminée

Je pense k'il a vraiment un prob avec ma variable Obstacle m_Ligne_droite(1 , "Ligne droite" , 0);  mais je sais pas pourquoi
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
3 avril 2007 à 22:48
Tu ne peux pas instancier directement un objet dans sa déclaration !

class Voiture
{
public: 

   // .ctor
   Voiture()
   {
      m_pLigne_droite = new Obstacle(1 , "Ligne droite" , 0);
   }

   // OU
   //Voiture(int i, string s, int j)
   //{
   //  m_pLigne_droite = new Obstacle(i , s , j);
   //}

   //.dtor
   ~Voiture()
   {
      if( m_pLigne_droite ) delete m_pLigne_droite;
   }   

private: 

   Obstacle m_obstacleEnCours; // appelle .ctor defaut
   Obstacle*m_pLigne_droite;   // non initialisé
};
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 avril 2007 à 00:00
Pourquoi utiliser un pointeur ? Pour risquer des fuites ?

La meme version sans pointeur:
class Voiture
{
public: 

   // .ctor
   Voiture():
      m_ligne_droite(1, "Ligne droite", 0)
   {
   }

   // OU
   //Voiture(int i, string s, int j)
   //{
   //  m_pLigne_droite = new Obstacle(i , s , j);
   //}

   //.dtor
   ~Voiture()
   {
      if( m_pLigne_droite ) delete m_pLigne_droite;
   }   

private: 

   Obstacle m_obstacleEnCours; // appelle .ctor defaut
   Obstacle m_ligne_droite;   // non initialisé
};
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 avril 2007 à 00:01
Bien sur, faut enlever le "delete m_pLigne_droite", j'ai oublié.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
4 avril 2007 à 15:07
J'utilise des ptrs pour l'agrégation d'objets, car s'il y en a beaucoup, trop de pression sur la pile.
Mais ta solution sera effectivement mieux compris par l'intéressé.

(pas de risque de fuite quant le destructeur est implémenté tout de suite)
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
4 avril 2007 à 15:09
Sinon tu peux passer sur VB et tu n'aura plus de problème de pointeur...
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 avril 2007 à 16:53
Mais il y a des chances pour qu'un object de classe Voiture soit deja un pointeur, auquel cas, je vois pas l'intéret du pointeur, puisqu'on ne travaillera pas sur la pile. (Ou éclaire moi si je me trompe) :)

Pour les fuites, ya pas que le pb du destructeur, mais des éventuels fonctions de recopies, et euh perso, j'ai jamais fais une classe d'une traite :)
0
Rejoignez-nous