Constructeur

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

  1. Modérateur
    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
    1. 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
      1. Modérateur
        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
    2. 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
      1. Modérateur
        Tu dois faire comme je l'ai fait, c'est à dire définir un constructeur sans argument...
        0
    3. 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
      1. Modérateur
        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
    4. tu utilises le mot inline, je ne l'ai jamais vu...n'y a t'il aucun autre moyen plus simple de faire?
      0
      1. Modérateur
        Tu peux l'enlever, ça fonctionnera quand même.
        0
    5. 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
      1. est on obligé de faire ça avec des get et set car j'ai rien vu de tout ça c'est interdit...
        0
        1. 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
          1. 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