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 :

Acces aux membres d'une classe dans une méthode "virtual"


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 33
    Points
    33
    Par défaut Acces aux membres d'une classe dans une méthode "virtual"
    Bonjour,
    j'ai un problème assez précis, et j'espere reussir a être assez clair.
    Je développe une application (sous linux) en C++. Je souhaite développer pour celle-ci une gestion de plugins, par l'intermediaire de librairies externes (.so sous linux, dll sous windows). La particularité est que je souhaite que cette librairie contienne une classe c++ (et non pas de simples fonctions). Pour ce faire j'ai lu deux tutos :
    http://hiko-seijuro.developpez.com/a...que-dynamique/
    http://www.linux.com/howtos/C++-dlop...solution.shtml

    J'ai compris les deux tutos. Seulement (mon manque de connaissance sur le polymorphisme y ai surement pour quelque chose). J'ai reproduit ces shémas pour mon appli.
    J'ai une classe "plugin" qui contient (pour l'exemple) une méthode déclarée comme suis :
    virtual string hello() const = 0 ;
    et un attibut :
    string monTest;
    Dans ma classe dérivée, j'implémante hello() comme suis :
    virtual string hello() const
    {
    return this->monTest;
    }
    je n'ai aucun souci. (je ne sais pas à quoi ser le const).
    Mon souci est que dans cette fonction, "return this->monTest; " ne pose pas de problème; alors que si je fais "this->monTest" = toto, j'obtiens une erreur de compilation :

    hello.cpp: In member function ‘virtual std::string Hello::hello() const’:
    hello.cpp:7: erreur: passing ‘const std::string’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’ discards qualifiers

    j'ai la meme chose si dans ma classe dérivée je déclare une méthode, et que j'essaie d'y accéder depuis hello().

    Ma question pas très précise, est donc de savoir comment à partir d'une fonction virutelle(pure?), procede t'on pour mettre à jour des attributs de la classe parente, et de la classe dérivée, et comment fait on pour appeller une méthode membre.

    J'espere ne pas m'ettre (vous avoir) trop perdu dans mes explications.
    Merci d'avance pour vos réponses.

    eponyme

  2. #2
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Le const après la déclaration de la méthode indique que cette méthode ne modifie aucune donnée de l'instance. Ce qui explique que tu n'obtiennes aucune erreur à la compilation lors du renvoi de monTest (et fort probablement que tu en obtiennes une lors de la modification )

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 33
    Points
    33
    Par défaut
    Voila effectivement qui explique beaucoup de choses

    J'ai essayé de me "débarrasser" de ce "const" mais alors si la compilation passe, je ne peux plus ouvrir ma dll.

    Ma question change un peu donc (dois je changer de topic ?) :
    Comment déclarer une fonction virtuelle pure (seul moyen d'obliger les classes dérivées à l'implémenter si j'ai bien compris) sans pour autant utiliser les "const=0" dans la déclaration et "const" dans l'implémentation.

    epo

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    le problème n'est pas que ta fonction est virtuelle, c'est qu'elle est const.

    Tu peux faire une fonction virtuelle non const en mettant juste "= 0" à la fin.. (et non "const = 0" ).

    Il existe quelques moyens de passer outre ( avec le const_cast<> ou en définissant ton attribute monTest comme mutable dans la classe). Mais généralement, si tu ne sais pas exactement ce que tu fais, c'est une très mauvaise idée de les utiliser.

    const_cast<> par exemple ne doit vraiment être utilisé que si on utilise une bibliothèque ou un code ancien qui est non const correct (qui n'utilise pas les const là où il devrait ).

    Commencer par bien comprendre les consts, leur utilisation et leur utilité est une bonne chose en C++.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 33
    Points
    33
    Par défaut
    J'ai effectivement lu dans les cours sur le site la facon de faire (en enlevant les "const" donc).

    Je testerais ca

    Merci à vous

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 33
    Points
    33
    Par défaut
    Bien j'ai fait le test.
    Ca marche parfaitement. Merci a vous pour votre aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2015, 15h44
  2. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  5. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36

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