IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

string comme paramètre d'un constructeur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut string comme paramètre d'un constructeur
    Bonjour à tous,

    Il doit y avoir une subtilité du C++ qui m'échappe. Si quelqu'un peut m'expliquer pourquoi j'ai un problème avec un constructeur qui prend une chaine (string) comme paramètre...

    Voici un morceau de code qui illustre le problème. Je l'ai compilé avec g++ (version 4.4 et 4.5 sous linux).

    Voici le Main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    // fichier Main.cpp
    #include "A.hpp"
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char* argv[])
    {
     
      cout <<"hello" << endl;
     
      string s("coucou");  
      A a(s);
     
      cout << " ---- " << endl;
     
      if (argc==2)
        {
     
          /* Tout ce qui suit fonctionne ! */
          string s2 = argv[1];
          A b(s2);
     
          A c=A(string(argv[1]));
     
          A d=string(argv[1]);
     
     
          char * cs = argv[1];
          string ps = string(cs);
     
          A e(argv[1]);
          e.affiche(string(argv[1]));
     
     
          /* Le problème commence ici */
          A f(string(argv[1]));
     
          /* Le compilateur signale :
    	 Main.cpp:46: warning: the address of ' f(std::string*)' will always evaluate as 'true'
          */
     
          /* f n'est même plus un objet... */
          //f.affiche(string(argv[1]));
          cout << f << endl;           
        }  
     
    }

    Le code de la classe A est assez standard...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <iostream>
     
     
    class A
    {
    private :
      std::string message;
     
    public :
      // Constructeur par défaut
      A()  
      {
        std::cout << "message par défaut" << std::endl;
      } 
     
      // constructeur avec une chaine
      A(std::string message)
      {
        std::cout << message << std::endl;
      }
     
      // fonction avec une chaine
      void affiche(std::string message)
      {
        std::cout << message << std::endl;
      }
    };
    Et je mets tout de même le Makefile (bien que simplicime...) car on ne sait jamais...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    all: Main
     
    Main : Main.cpp
    	g++ -W -Wall Main.cpp -o Main
     
    clean :
    	rm Main
    Si quelqu'un a une idée de ce comportement ça m'intéresse !

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Il faudrait peut être aussi indiquer quel est précisément le problème rencontré.

    Au minimum il manque

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut
    Citation Envoyé par gl Voir le message
    Il faudrait peut être aussi indiquer quel est précisément le problème rencontré.
    Oui, j'aurais du préciser qu'en plus du message bizarre à la compilation (que j'ai indiqué dans le source).

    L'exécution produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ./Main developpez
    hello
    coucou
     ---- 
    developpez
    developpez
    developpez
    developpez
    developpez
    1
    Donc le dernier constructeur n'est pas appelé (Il y 6 appels de constructeurs qui affichent la chaine en paramètre). De plus, f vaut 1 (ce qui semble compatible avec l'indication du compilateur comme quoi c'est toujours vrai...) or, c'est un objet (dont le flux de sortie n'est même pas défini...).

    Au minimum il manque
    J'avais testé avec et sans, ça ne change pas...

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Le problème (ce qui ne va pas) n'est pas clair du tout.

    J'essaie d'interpréter comme je peu:

    Donc le dernier constructeur n'est pas appelé (Il y 6 appels de constructeurs qui affichent la chaine en paramètre).
    Si je comprends bien, après avoir analysé le code, cette ligne (que tu aurais pu isolé ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     /* Le problème commence ici */
          A f(string(argv[1]));
    N'affiche pas le string comme pour les autres initializations.

    Si c'est ça, je ne suis pas sur du problème, mais il faudrait vérifier si cette ligne n'est pas interprettée comme une signature de fonction. D'après le warning, j'ai l'impression que c'est le cas.

    Je ne comprends pas pourquoi cette ligne compile. A part si ma précédente supposition est vrai, il est impossible que cette ligne compile puisque dans le code fournis tu n'as pas défini d'opérateur de flux (operator<<).

  5. #5
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    ca manque de const& tout ces passages d'arguments

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     A f(std::string(argv[1]));
    est compris comme une déclaration de fonction qui prend en argument un std::string* et retourne un A. Pas comme un objet de type A. Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string s;
    A ret = f(&s);
    Ce code compile.


    Dans ce cas, vaut mieux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A f = A(std::string(argv[1]));
    Cf F.A.Q. Y a-t-il une différence quelconque entre MaClasse x; et MaClasse x(); ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut
    Citation Envoyé par Joel F Voir le message
    ca manque de const& tout ces passages d'arguments
    Je suis d'accord, mais ça ne change rien au problème (j'avais aussi testé avec et sans avant de poster).

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par yayel59 Voir le message
    en plus du message bizarre à la compilation (que j'ai indiqué dans le source).
    Au temps pour moi, j'ai zappé le commentaire.

Discussions similaires

  1. [Débutant] Utilisation d'un string comme paramètre passé à une méthode
    Par LaBoétie dans le forum C#
    Réponses: 10
    Dernier message: 27/02/2015, 11h29
  2. chaine de connexion comme paramètre du constructeur de connexion
    Par hannah-sweet dans le forum Visual Studio
    Réponses: 2
    Dernier message: 27/09/2010, 12h45
  3. Réponses: 9
    Dernier message: 04/11/2008, 18h05
  4. Un fichier .bmp comme paramètre d'une Procédure stockée
    Par FONKOU dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/10/2004, 17h56
  5. Type String* en paramètre...
    Par Invité dans le forum MFC
    Réponses: 4
    Dernier message: 24/02/2004, 19h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo