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 !