Constructeur

Marina -  
patcartier Messages postés 65 Date d'inscription   Statut Membre Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
Marina
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
Marina
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu dois faire comme je l'ai fait, c'est à dire définir un constructeur sans argument...
0
Marina
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
Marina
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu peux l'enlever, ça fonctionnera quand même.
0
Marina
 
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
Marina
 
est on obligé de faire ça avec des get et set car j'ai rien vu de tout ça c'est interdit...
0
Marina
 
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 65 Date d'inscription   Statut Membre Dernière intervention   31
 
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