Constructeur

Fermé
Marina - 16 janv. 2013 à 18:02
patcartier Messages postés 63 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 27 novembre 2013 - 16 janv. 2013 à 23:44
Bonjour,

J'ai une petite question simple svp, dans mon main j'ai ceci:

Avion v;
Avion v1("jet");


Donc j'ai 2 objets de type classe Avion, mon constructeur prend en paramètre son nom, donc une chaîne dans la classe mais il doit être aussi possible de le créer sans lui passer son nom en paramètre. Comment faire, j'ai essayé d'écrire 2 constructeurs mais seul un est tjs appelé..

Merci.

9 réponses

KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
16 janv. 2013 à 18:30
Tu dois utiliser des méthodes d'accès (get/set) pour modifier le nom :

Exemple complet :

#include <iostream>
#include <string>

class Avion
{
protected:
	std::string nom;
	
public:
	inline Avion()
	{
		nom="_default_";
	}
	
	inline Avion(std::string str)
	{
		nom=str;
	}
	
	inline void setNom(std::string nouveau)
	{
		nom = nouveau;
	}
	
	inline std::string getNom()
	{
		return nom;
	}
};

int main()
{
	Avion v;
	std::cout << v.getNom() << std::endl;
	
	v.setNom("boeing");
	std::cout << v.getNom() << std::endl;
	
	v.setNom("airbus");
	std::cout << v.getNom() << std::endl;
	
	return 0;
}
0
Bonjour, non mon main est simplement celui ci:

int main(void)
{
Avion v;
Avion v1("jet");
}


A l'exécution j'ai ceci sur la sortie standard:

Avion allumé
Avion jet allumé

Donc je fais 2 constructeurs avec des cout << dedans?

merci
0
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
16 janv. 2013 à 18:47
Il n'y a aucune raison de mettre des cout dans un constructeur. Ça peut bien sûr être utile pour le débogage mais ce n'est pas une fin en soit...

Si tu ne passes pas le nom en paramètre, soit tu utilises un nom par défaut, soit il faut que tu le définisses après coup avec une méthode... Mais ton main n'est clairement pas suffisant !
0
C'est un exercice que je fais et donc qu'on m'impose, rien ne marche, je te montre mon code, je re précise que le main reste inchangé c'est obligatoire:

int main(void)
{
Avion v;
Avion v1("jet");
return 0
}


class avion
{
private:
std::string name;

public:
Avion(std::string name);
~Avion();
}


Et donc avec ça j'ai tjs l'erreur au compilateur: no machting function for call Avion:Avion()..c'est du au fait que dans le main j'ai Avion v et que je passe aucun argument (pas de parenthèse), comment résoudre ça?
0
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
16 janv. 2013 à 19:00
Tu dois faire comme je l'ai fait, c'est à dire définir un constructeur sans argument...
0
mais si je fais comme tu dis j'aurais tjs un message d'erreur à cause du second appel Avion v1("jet") car je DOIS passer le nom en paramètre mais je dois aussi pour l'appeler SANS paramètre avec une chaine vide par défaut, donc je suis bloquée...
0
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
16 janv. 2013 à 19:07
En quoi tu es bloquée !?

Regarde mon code, en remplaçant mon main par le tien, ça marche très bien, donc ce que j'ai fait répond à ton problème, alors analyses tout ça !
0

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

Posez votre question
tu utilises le mot inline, je ne l'ai jamais vu...n'y a t'il aucun autre moyen plus simple de faire?
0
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
16 janv. 2013 à 19:22
Tu peux l'enlever, ça fonctionnera quand même.
0
non ça ne marche pas tu écris des fonctions annexes, donc je repose ma question, comment avoir mon résultat avec mon main, 2 constructeurs? Je ne dois pas écrire de get ou autre...
0
est on obligé de faire ça avec des get et set car j'ai rien vu de tout ça c'est interdit...
0
je suis désolée mais ta méthode ne marche pas avec mon main KK je viens d'essayer :(...
Absolument rien ne marche, je te montre tout monde code, le main DOIT RESTER INCHANGé:

main.cpp:

int main(void)  
{  
Avion v;  
Avion v1("jet");  
return 0  
}  


avion.hh:


class avion  
{  
private:  
std::string name;  

public:  
Avion(std::string name);  
~Avion();  
}  


avion.cpp

Avion::Avion(std::string name)  
{  
std::cout << "Avion" << this->name << "allumé" << std::endl;  
}  


Que dois je ajouter dans mon avion cpp et avion.hh pour que le premier appel du main, donc Avion v; fonctionne...
0
patcartier Messages postés 63 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 27 novembre 2013 31
16 janv. 2013 à 23:44
moi, je dirais juste qu'il te manque un constructeur simple dans ton . h :

Avion();

et dans ton .cpp :

Avion::Avion()
{}


car t'en as un sans argument et l'autre avec.

donc, un sans string et l'autre avec un string.
0