Bonjour!!
Je suis en train d'apprendre le C++ grace au fabuleux livre "Apprendre le C++" de Claude Delannoy. Le livre est vraiment complet et très clair, mais il y a quelques soucis qui me pose problème malgré tout.
Je vais essayer de les énumerer dans ce fil.
Bon, d'abord, je signale que je travaille sous Linux (même si windows est aussi installé sur mon ordi ce qui me permet de tester mes programmes sous windows ca marche pas sous Linux!!!)
J'utilise aussi la version 4.4.1 du comiliateur g++.
Mon premier problème concerne l'appel du constructeur par recopie quand une fonction renvoie un objet. Voici un exemple qui illustre mon problème :
Je n'ai pas de problème de compilation, mais le constructeur de recopie n'est pas appelé. Dans mon exemple, ca n'a aucune importance, mais ca en aurait si l'un des membres de la classe était un tableau.
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 #include <iostream> using namespace std; class point { private : int x, y; public : point(int abs=0, int ord=0) // Constructeur "usuel" { x=abs; y=ord; cout << "++ Appel Const. usuel " << this << " " << x << " " << y << "\n"; } point(const point & p) // Constructeur de recopie { x=p.x; y=p.y; cout << "++ Appel Const. recopie " << this << " " << x << " " << y << "\n"; } ~point() // Destructeur { cout << "-- Appel Destr. " << this << " " << x << " " << y << "\n"; } point symetrique(); }; point point::symetrique() { point res; res.x = -x; res.y = -y; return res; } main() { point a(1, 3), b; cout << "** avant appel de symetrique\n"; b = a.symetrique(); cout << "** apres appel de symetrique\n"; }
Voici ce que me donne l'execution de mon précédente programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 alphonse@alphonse-ordi:~/Documents/C++/ApprendreC++/ch13$ ./copyctr3 ++ Appel Const. usuel 0xbfe6a898 1 3 ++ Appel Const. usuel 0xbfe6a890 0 0 ** avant appel de symetrique ++ Appel Const. usuel 0xbfe6a888 0 0 -- Appel Destr. 0xbfe6a888 -1 -3 ** apres appel de symetrique -- Appel Destr. 0xbfe6a890 -1 -3 -- Appel Destr. 0xbfe6a898 1 3 alphonse@alphonse-ordi:~/Documents/C++/ApprendreC++/ch13$
J'ai aussi un souci dans la spécialisation de fonction membre d'un patron de classe. Voici un bout de code donné en exemple dans le bouquin :
Quand j'essai de compiler le fichier, voici ce que j'obtiens :
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 #include <iostream> using namespace std; // Patron de classe : template <class T> class point { private : T x; T y; public : point(T abs=0, T ord=0) { x = abs; y = ord; } void affiche(); }; // Définition de la fonction affiche : template <class T> void point<T>::affiche() { cout << "Coordonnées : " << x << " " << y << "\n"; } // Fonction specialisée pour l'affichage des caractères : void point<char>::affiche() { cout << "Coordonnées : " << (int)x << " " << (int)y << "\n"; } main () { point<int> ai(3, 5); ai.affiche (); point<char> ac('d', 'y'); ac.affiche (); point<double> ad(3.5, 2.3); ad.affiche (); }
Le plus drole, c'est qu'en essayant le même code sous windows, ca pose pas de problème. Ca vient du compilateur?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 alphonse@alphonse-ordi:~/Documents/C++/ApprendreC++/ch18$ g++ special.cpp -o special special.cpp:23: error: too few template-parameter-lists alphonse@alphonse-ordi:~/Documents/C++/ApprendreC++/ch18$
J'ai un autre souci concernant l'initialisation d'objet, mais j'ai pas d'exemple sur moi : je vais voir si je peut trouver ca rapidement.
D'ici là, merci d'avance pour les réponses au problème que j'ai posté...
Partager