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 :

Penser en C++ chapitre 14 exercice 9


Sujet :

C++

  1. #1
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut Penser en C++ chapitre 14 exercice 9
    Salut à tous,

    Je réapprends à programmer en C++ en lisant Penser en C++ et je bloque sur l’exercice 9 du chapitre 14 :
    Héritez une classe StringVectorde vector<void*>et redéfinissez les fonctions membres push_back( )et operator[]pour accepter et produire des string*. Qu'est-ce qui arrive si vous essayez de push_back( )un void*?
    Ce qui me pose problème c'est la redéfinition de operator[] ( Rien ne vous empêche de donner aussi vôtre avis sur le redéfinition de push_back, si nécessaire ): Je n'arrives pas à comprendre comment renvoyer une référence sur un std::string*

    Voici mon code :
    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
    #include <vector>
    #include <iostream>
     
    class StringVector : public std::vector<void*> {
    public:
    	void push_back ( std::string* s );
    	std::string*& operator [] ( size_type n );
    };
     
    void StringVector::push_back ( std::string* spt ) {
    	std::vector<void*>::push_back ( static_cast<void*>(spt) );
    }
     
    std::string*& StringVector::operator [] ( size_type n ) {
    	return (static_cast<std::string*>(this->vector<void*>::operator [] ( n )));
    }
     
    void main () {
    	StringVector sv;
     
    	//Test de push_back
    	std::string* spt = new std::string ( "abc" );
    	sv.push_back ( spt );
    	spt = new std::string ( "def" );
    	sv.push_back ( spt );
    	spt = new std::string ( "ghi" );
    	sv.push_back ( spt );
     
    	std::cout << "iterator :" << std::endl;
    	for ( StringVector::iterator it = sv.begin(); it != sv.end(); ++it )
    		std::cout << (static_cast<std::string*>(*it))->data() << std::endl;
     
    	//Test de operator []
    	std::cout << "operator [] :" << std::endl;
    	for ( unsigned int i = 0; i < sv.size(); ++i ) {
    		std::cout << i << " = " << sv[i] << std::endl;
    	}
     
    	system ("pause");
    }
    et l'erreur de compilation ligne 15 :
    error C2440: 'return'*: impossible de convertir de 'std::string *' en 'std::string *&'

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Salut.

    Personnellement, j'ai un message d'erreur un peu plus explicite :
    erreur: invalid initialization of non-const reference of type ‘std::string*& {aka std::basic_string<char>*&}’ from an rvalue of type ‘std::string* {aka std::basic_string<char>*}’
    En gros, ça dit que tu essaies de créer une référence sur une std::string temporaire, qui de plus a une durée de vie inférieure à la référence que tu veux créer.

    Tu dois te dire que std::vector<void*>::operator[] retourne un void*&, et non pas un void*.
    À partir de là, on peut être tenté de modifier le cast par : static_cast<std::string*&>.

    Sauf que ça ne fonctionne pas non plus :
    erreur: invalid static_cast from type ‘void*’ to type ‘std::string*& {aka std::basic_string<char>*&}’
    Le problème vient du type de cast utilisé.
    S'il est très simple de transtyper n'importe quel type de pointeur vers un void*, même implicitement, l'inverse est faux.
    Il faut indiquer explicitement que l'on veut travailler sur des données de types différents, bien que liés, et pour cela le static_cast ne suffit pas.
    Il faut utiliser à la place l'opérateur reinterpret_cast.

    Je ne m'étends pas plus sur le sujet, tu le verras en temps voulu si ce n'est pas encore fait.
    Au cas où, cette entrée de la FAQ peut t'être utile :
    Comment effectuer une conversion de type explicite (cast) ?

    Bon courage !

  3. #3
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Merci steph ,

    J'ai remplacé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (static_cast<std::string*>(this->vector<void*>::operator [] ( n )));
    par ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (reinterpret_cast<std::string*&>(this->vector<void*>::operator [] ( n )));
    et ça semble fonctionner : je n'avais pas compris qu'il fallait utiliser un reinterpret_cast

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Oui, les histoires de transtypage en C++, ce n'est pas évident au départ.
    Mais une fois qu'on a fait quelques erreurs, on a compris le truc !

    Bonne continuation !

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Pour te souvenir, T a = static_cast<T>(b) ne fonctionne que si T a(b) est une expression valide. reinterpre_cast<> fonctionne systématiquement, const_cast<> ne fonctionne que si on change (enlève ou ajoute) un qualifier cv (const, volatile ou les deux), et dynamic_cast<> ne fonctionne que pour faire un cast dans une hiérarchie de classe.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSL] numérotation de chapitres
    Par CoCoZ dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/08/2004, 18h52
  2. Pages d'exercices à faire pour l'autoformation ?
    Par [thebadskull] dans le forum Evolutions du club
    Réponses: 13
    Dernier message: 15/06/2004, 20h26
  3. Merci de penser au tag [Résolu] SVP
    Par grafikm_fr dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 02/05/2004, 13h13
  4. Que penser de l'avenir de glut??
    Par xg dans le forum GLUT
    Réponses: 4
    Dernier message: 06/02/2004, 13h12
  5. Pouvez vous m'aider a resoudres ces 3 exercices
    Par algorithmique dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 09/08/2002, 17h26

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