OVH Cloud OVH Cloud

incompréhension [Débutant]

1 réponse
Avatar
Amédée
Bonjour,

Je souhaite écrire une petite application de gestion d'objet
postaux,comprenant pour l'instant
une classe ObjetPostal ainsi que sa dérivation publique Lettre.C'est dans
cette derniere que figure mon incompréhension.


Voici le code :

-------------------------------------------------------------------------------
using namespace std;

class Lettre : public ObjetPostal{

friend ostream &operator<<( ostream & , const Lettre & );

protected :

bool urgence;

public :

Lettre (string dn , string da , int c , string dv, bool r, bool u)
: ObjetPostal ( dn , da , c , dv , r) {
urgence = u;
}

float prixAff () {

float prix = 0.5;

if (recom){
prix += 2;
}

if (urgence) {
prix += 3;
}

return prix;
}

};


ostream &operator<<(ostream & o , const Lettre & c){
cout << (ObjetPostal) c << endl;
o << "en urgence ?? :" << Lettre::urgence << endl;
}
--------------------------------------------------------------------------------------

Voici maintenant les invectives de mon compilo:


MassiveAttack# g++ Lettre.cpp
Lettre.cpp:3: erreur d'analyse syntaxique avantle jeton « { »
Lettre.cpp: Dans function « float prixAff() »:
Lettre.cpp:22: « recom » non déclaré (première utilisation dans cette
fonction)
Lettre.cpp:22: (Chaque identificateur non déclaré est rapporté seulement
une
seule fois pour la fonction dans laquelle il apparaît.)
Lettre.cpp:26: « urgence » non déclaré (première utilisation dans cette
fonction)
Lettre.cpp: At global scope:
Lettre.cpp:33: erreur d'analyse syntaxique avantle jeton « } »
Lettre.cpp:36: erreur de syntaxes avantle jeton « & »
Lettre.cpp:38: erreur de syntaxes avantle jeton « << »

--------------------------------------------------------------------------------------

La classe parente munie de la methode virtuelle pure prixAff() :

#include "ObjetPostal.h"

using namespace std;


// char * ObjetPostal::getName() const {
// return (char *) destName;
// }


class ExcepNom : public exception{

public :

const char * what () const throw () {
return "Exception : nom MAnquant";
}

};

class ExcepAd : public exception {

public :
const char * what() const throw() {
return " Censé retourner le nom du destinataire ";
}
};

ObjetPostal :: ObjetPostal(string dn = "",string da="", int c= 0 ,
string dv= "",bool r = false)
throw(ExcepNom,ExcepAd) {

if (!dn.compare(""))
throw ExcepNom();
destName= dn;
if (!da.compare("") || c == 0)
throw ExcepAd();
destAdr = da;
codeP = c;

}



float ObjetPostal:: operator+ (ObjetPostal & c){
return prixAff() + c.prixAff();
}

ostream &operator<< ( ostream & o , const ObjetPostal & c){
o << "nom de destination : " << c.destName << endl;
o << " adresse de destiantion : " << c.destAdr << endl;
o << " code postal : " << c.codeP << endl ;
o << "vile de destination" << c.destVille << endl;
o << " valeur de recommandé :" << c.recom << endl;
return o;
}

--------------------------------------------------------------------------------------


Merci d'avance pour vos quelconques remarques.

--
Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

1 réponse

Avatar
Eric Fournier
"Amédée" a écrit dans le message de
news:
Bonjour,

Je souhaite écrire une petite application de gestion d'objet
postaux,comprenant pour l'instant
une classe ObjetPostal ainsi que sa dérivation publique Lettre.C'est dans
cette derniere que figure mon incompréhension.


Voici le code :

--------------------------------------------------------------------------
-----

using namespace std;


Il ne faut jamais include de directives "using namespace" dans un .h


class Lettre : public ObjetPostal{

[...]


ostream &operator<<(ostream & o , const Lettre & c){
cout << (ObjetPostal) c << endl;


En C++, il est recommandé d'utiliser static_cast, dynamic_cast ou
reinterpret_cast plutôt que des cast traditionnel du C.
Dans le cas présent, ce serait static_cast.

o << "en urgence ?? :" << Lettre::urgence << endl;
}
--------------------------------------------------------------------------
------------


Voici maintenant les invectives de mon compilo:


MassiveAttack# g++ Lettre.cpp
Lettre.cpp:3: erreur d'analyse syntaxique avantle jeton « { »


Je dirais que soit tu n'as pas inclu ObjetPostal.h, soit il te manque un "}"
ou un ";" à la fin du dernier fichier que tu inclus.

Lettre.cpp: Dans function « float prixAff() »:
Lettre.cpp:22: « recom » non déclaré (première utilisation dans cette
fonction)
Lettre.cpp:22: (Chaque identificateur non déclaré est rapporté seulement
une
seule fois pour la fonction dans laquelle il apparaît.)
Lettre.cpp:26: « urgence » non déclaré (première utilisation dans cette
fonction)
Lettre.cpp: At global scope:
Lettre.cpp:33: erreur d'analyse syntaxique avantle jeton « } »
Lettre.cpp:36: erreur de syntaxes avantle jeton « & »
Lettre.cpp:38: erreur de syntaxes avantle jeton « << »

--------------------------------------------------------------------------
------------

[...]
ObjetPostal :: ObjetPostal(string dn = "",string da="", int c= 0 ,
string dv= "",bool r = false)
throw(ExcepNom,ExcepAd) {

if (!dn.compare(""))
throw ExcepNom();


Il semble contradictoire d'avoir "" comme paramètre par défaut pour dn, puis
de lancer une exception si l'argument pred cette valeur.

destName= dn;
if (!da.compare("") || c == 0)
throw ExcepAd();


Même chose.

destAdr = da;
codeP = c;

}



float ObjetPostal:: operator+ (ObjetPostal & c){
return prixAff() + c.prixAff();
}


Sémantiquement, je vois mal comment additionner des lettres donne des prix.
L'opérateur + devrait rester non-défini, et l'usager devrait appeller
ObjetPostal::prixAff pour chaque objet lorsqu'il désire additionner des
prix.


ostream &operator<< ( ostream & o , const ObjetPostal & c){
o << "nom de destination : " << c.destName << endl;
o << " adresse de destiantion : " << c.destAdr << endl;
o << " code postal : " << c.codeP << endl ;
o << "vile de destination" << c.destVille << endl;
o << " valeur de recommandé :" << c.recom << endl;
return o;
}

--------------------------------------------------------------------------
------------



Merci d'avance pour vos quelconques remarques.

--
Using Opera's revolutionary e-mail client: http://www.opera.com/m2/