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...
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
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; } };
Si quelqu'un a une idée de ce comportement ça m'intéresse !
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![]()
Partager