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

C++ Discussion :

Apprendre le C++ : petits problèmes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut Apprendre le C++ : petits problèmes
    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 :
    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";
    }
    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.

    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 :
    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 ();
    }
    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
    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$
    Le plus drole, c'est qu'en essayant le même code sous windows, ca pose pas de problème. Ca vient du compilateur?


    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é...

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Alphonse Capriani Voir le message
    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 aussi bourré d'erreurs
    Citation Envoyé par Alphonse Capriani Voir le message
    Je n'ai pas de problème de compilation, mais le constructeur de recopie n'est pas appelé.
    Le compilateur a explicitement le droit de ne pas appeler le constructeur de recopie dans ce cas, même si le comportement est alors différent. C'est une sorte d'optimisation.
    Citation Envoyé par Alphonse Capriani Voir le message
    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
    #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();
    	};
     
    // Fonction specialisée pour l'affichage des caractères : 
    void point<char>::affiche()
    {
    	cout << "Coordonnées : " << (int)x << " " << (int)y << "\n";
    }
    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
    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$
    Ce code n'est pas correct, même si visual C++ l'accepte à tort...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<>
    void point<char>::affiche()
    {
    	cout << "Coordonnées : " << (int)x << " " << (int)y << "\n";
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Merci pour la rapidité de cette réponse.

    Je reviens quand même sur tes remarques (j'espère que ca te dérange pas si je te tutoies!!! )

    Mais aussi bourré d'erreurs
    Probablement (j'en ai déjà répertorié plusieurs depuis le début, mais globalement elles sont suffisament énormes pour que je trouve la parade - des fautes de frappe pour la plupart).
    Néanmoins, sur un bouquin de 750 pages, fallait s'y attendre. Je maintiens que c'est un bon bouquin pour débuter...

    Le compilateur a explicitement le droit de ne pas appeler le constructeur de recopie dans ce cas, même si le comportement est alors différent. C'est une sorte d'optimisation.
    Je me doutais que c'étais un truc du genre qu'il se passait, mais je doit admettre que c'est assez gênant. Il n'y a pas moyen de forcer le compilateur à utiliser le constructeur par recopie? Comme je le disais, ca pose pas de souci dans l'exemple que j'ai posté, mais j'ai essayer avec un renvoie de classe dont un membre est un tableau, et j'ai le même problème. Et là c'est vraiment embettant puisqu'on a pas réellement recopie de l'objet au niveau du tableau...

    Cela dit, merci encore pour cette réponse rapide...

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Alphonse Capriani Voir le message
    Comme je le disais, ca pose pas de souci dans l'exemple que j'ai posté, mais j'ai essayer avec un renvoie de classe dont un membre est un tableau, et j'ai le même problème. Et là c'est vraiment embettant puisqu'on a pas réellement recopie de l'objet au niveau du tableau...
    Donne un code complet. Et n'oublie pas qu'une assignation n'appelle jamais le constructeur de copie mais l'operateur d'assignation (c'est d'ailleurs extremement rare de devoir ecrire l'un en pouvant se fier sur la version de l'autre generee automatiquement).

    Dans ton exemple, il y a construction de la variable res de symmetrique (par defaut), construction de la valeur retournee (par copie), assignation de celle-ci a b (operateur=). La seconde peut etre omise en faisant en sorte que la variable res occupe la place de la valeur retournee.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Ok : je vais fournir un exemple...

    Il va juste falloir patienter un peu

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par Alphonse Capriani Voir le message
    a- Je reviens quand même sur tes remarques (j'espère que ca te dérange pas si je te tutoies!!! )

    b- Probablement (j'en ai déjà répertorié plusieurs depuis le début, mais globalement elles sont suffisament énormes pour que je trouve la parade - des fautes de frappe pour la plupart).
    Néanmoins, sur un bouquin de 750 pages, fallait s'y attendre.

    c- Je maintiens que c'est un bon bouquin pour débuter...
    a- C'est le contraire qui me perturbe sur les forums

    c- AC++ est un bon bouquin pour débutants, et en plus tu es bilingue! (à en lire ta localisation) Profites-en.

    b- tu vois les erreurs grossières, comme la signature incorrecte du main dans les exemples du §7 (arf, et en plus, l'auteur sait que c'est incorrect...)

    Nous voyons des choix de pédagogie criticables :
    - choix du C++ historique
    - plus axé sur la syntaxe plutôt que sur les pratiques (comparer l'approche des divers héritages entre le livre et la FAQ -- c'était vrai dans l'ancienne version du livre du moins, le chapitre patché correspondant n'est pas librement accessible sur le site de l'éditeur)
    - §11: point::initialise() -- les débutants qui voient cette mauvaise pratique tendent à ne pas corriger le tir ensuite pour passer aux constructions initialisantes [et après on se retrouve avec des règles qualité qui prônent l'utilisation de ses fonction init(), ce qui est une faute de style)

    Nous voyons aussi les fautes de style:
    - comme les déclarations non initialisantes (même exemple)



    Je vois aussi quelques choix de vocabulaire fort étrange (moins grave, mais déroutant) :
    - c'est la première fois que je lis "argument muets" (le terme répandu est "paramètre formel")
    - "surdéfinition", ça je ne peux toujours pas ...

    Et d'autres bizarreries:
    - §7, il tourne autour du pot concernant les différences entre struct et class. Arf, §7.7.1 plus loin "toutefois, seul le type class permet l’encapsulation des données", OK je comprends mieux ... il ne connait pas la différence entre les deux.
    - §7: "La tendance la plus naturelle consiste à placer la déclaration d’une fonction à l’intérieur des déclarations de toute fonction l’utilisant" ...

    Bref. Je note des tous petits progrès au vu des pdf en ligne comparé avec le bouquin papier. Mais je ne serai pas surpris que certaines erreurs invisibles aux néophytes (comme celles sur les castings) persistent dans la dernière édition, ou encore que des notions importantes comme les listes d'initialisation soient toujours passées sous silence contrairement aux fonctions variadiques (qui n'ont même pas l'air d'aborder leur incompatibilité avec les types non-POD...), pareil pour affectation et héritage, ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    §11: point::initialise() -- les débutants qui voient cette mauvaise pratique tendent à ne pas corriger le tir ensuite pour passer aux constructions initialisantes [et après on se retrouve avec des règles qualité qui prônent l'utilisation de ses fonction init(), ce qui est une faute de style)
    Dans l'édition que je possède (la sixième), la classe « point » n'apparaît pas dans le onzième chapitre mais dans le douzième, et l'initialisation est faite dans le constructeur (pas de méthode « initialise »).

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Donc, si je comprends bien, les extraits de chapitres qui sont en ligne ne correspondraient pas à la dernière version ?
    Il parle des listes d'initialisation pour construire les membres ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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