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

Langage C++ Discussion :

Polymorphisme, new et reference


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Par défaut Polymorphisme, new et reference
    Bonjour,

    récemment, j'ai fait quelque chose qui marche, mais qui, à mon avis, est assez moche.
    J'ai une classe CMyStream qui dérive de std::ostream et qui redéfinit quelques petites choses...

    Or dans mon code, quand je veux utiliser mon stream, je ne peux pas faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CMyStream monStreamTest(parametres_Constructeur);
    monStreamTest << "Salut tout le monde" << std::endl;
    En effet, l’opérateur "<<" n'est pas redéfini dans ma classe (ben oui je vais pas m’embêter) et je ne peux pas profiter de celui de ostream par polymorphisme (argh c'est pourtant ça que je voudrais, je suis feignant moi) car monStreamTest n'est ni un pointeur ni une référence.

    A l'inverse, ceci marche très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ostream* monStreamTest=new CMyStream(parametres_Constructeur);
    (*monStreamTest) << "Salut tout le monde" << std::endl;
    // ...
    delete(monStreamTest); // oui oui le destructeur est virtuel toussa toussa ;)
    Mais franchement je ne trouve pas ça super mignon (le déréférencement) et pas naturel a taper. Un simple "monStreamTest" serait tellement plus esthétique.

    Alors j'ai trouvé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ostream& monStreamTest=*(new CMyStream(parametres_Constructeur));
    monStreamTest << "Salut tout le monde" << std::endl;
    // ...
    Ça marche, c'est plus joli à utiliser... Mais franchement j'ai un peu peur de me faire taper dessus... Je ne pense pas que les références aient été prévues pour ça, et je suppose que je dois deleter mon allocation en mémoire dynamique mais j'ai peur que le programme m'en veuille de venir souiller sa référence comme ça... Et je ne saurais même pas la syntaxe correcte..
    Bref je soupçonne le gros truc dégueulasse.

    En gros, j'aimerais votre avis, et si ça vous irrite les yeux, dites moi ce que je peux faire (une solution de débutant tellement plus évidente, élégante et sure..)

    Merci pour votre aide et dsl pour le choc !

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    A vrai dire, tant que tu utilises le type réel de ta classe, il n'y a meme pas besoin de recourir à l'allocation dynamique de la mémoire .

    Tu pourrais donc parfaitement écrire un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CMyStream  monStreamTes(parametres_Constructeur);
    monStreamTest << "Salut tout le monde" << std::endl;
    Par la suite, si tu le transmet à une fonction qui prend une référence sur un ostream, tu n'auras, a priori, pas de problème non plus (pour autant que les conditions d'héritage soient remplies )

    Le seul cas où tu auras, efffectivement, besoin de l'allocation dynamique, c'est si tu veux utliser un ostream dont le type réel sera déterminé à l'exécution, mais je présume, si tu as pris la peine de faire dériver ta classe de ostream, que ce cas risque d'être relativement peu fréquent
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    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 Bouteille Voir le message
    J'ai une classe CMyStream qui dérive de std::ostream et qui redéfinit quelques petites choses...
    Generalement, c'est mal fait.

    Or dans mon code, quand je veux utiliser mon stream, je ne peux pas faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CMyStream monStreamTest(parametres_Constructeur);
    monStreamTest << "Salut tout le monde" << std::endl;
    C'est signe que c'est mal fait. Jouons aux devinettes, parmi les choses que tu as definie dans CMyStream il y a un operator<< et celui masque celui de la classe de base. Donc il suffit d'ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    using std::ostream::operator<<;
    dans ta definition de CMyStream.

    (Ca reste mal fait, j'ai du mal a voir les cas ou definir un operator<< dans un descendant de ostream est la chose a faire).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Par défaut
    Woups je crois que je me suis mal exprimé. Merci pour vos commentaires.

    En réalité, je ne redéfinis pas du tout l’opérateur << de ostream dans ma classe, au contraire je n'y touche pas. Pour les détails vous avez tout le code dans le dernier message ici (ça a juste un peu été amélioré depuis mais le mécanisme d'héritage n'a pas bougé) : Ajouter une en-tete à un ostream

    Je touche juste au streambuf. Je ne voudrais du coup pas masquer l’opérateur de ostream mais en tirer bénéfice en l'utilisant pour CMyStream.

    Or quand j'essaye dans mon programme le premier encart que j'ai posté, j'ai à la compilation :
    In function 'int main()':
    erreur: invalid operands of types 'CMyStream()' and 'const char [20]' to binary 'operator<<'
    ||=== Build finished: 1 errors, 0 warnings ===||
    Je dois passer a coté de quelque chose d’évident sur l'héritage.. J’espère... En attendant je vais relire le cours sur le site

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    C'est plus simple avec le message d'erreur. Tu as declare
    en pensant definir une variable de type CMyStream alors que tu as declare une fonction qui retourne un CMyStream.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Par défaut
    Ah...
    Hum...

    Ben oui ca marche... Je crois que ce n'est pas la première fois en plus.
    Désolé de vous avoir fait perdre votre temps.
    Merci...

    Au passage si vous avez des remarques sur limplémentation du CMyStream dans l'autre message je suis preneur.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/06/2014, 17h10
  2. [Joomla!] Chronoforms: Deprecated: Assigning the return value of new by reference is deprecated
    Par sitws dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 26/11/2011, 15h21
  3. Polymorphisme Heritage reference
    Par kamimar dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 11/06/2008, 17h39
  4. new : Object reference not set to an instance of an object
    Par zulad dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/06/2007, 20h35
  5. Polymorphisme + New
    Par vincho dans le forum C++
    Réponses: 30
    Dernier message: 15/12/2006, 16h11

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