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 :

Classe agissant sur sa d�riv�e


Sujet :

Langage C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2007
    Messages
    60
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par d�faut Classe agissant sur sa d�riv�e
    Bonjour,

    Dans le cadre du d�veloppement d'une biblioth�que, je suis tomb� sur un os assez costaud. Voici une description du probl�me, si quelqu'un a une id�e :

    J'ai une classe A qui contient un membre v.
    J'ai une classe B qui h�rite de A � un certain niveau (telles que pour b de type B, b.A::v est accessible publiquement).

    Je veux �crire une classe template C<T, n> telle que si B h�rite de C<B, n>, alors la construction d'un objet b de type B assigne n � b.A::v.

    Pour l'instant, j'ai trouv� la solution suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct A { int v; };
    template<typename D, int n>
    struct C {
      C() {
        D* dhis = static_cast<D*>(this);
        A* ahis = static_cast<A*>(this);
        ahis->v = n;
      }
    };
    Ce code fonctionne bien dans la plupart des cas, mais il y a un hic dans le cas d'h�ritage virtuel :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    // le code précédent
    struct X: A { virtual ~X() {} };
    struct B : virtual X, C<B, 13> {};
    En effet, la construction d'une instance de B segfaute.
    Quelqu'un aurait-il une id�e sur un moyen de g�n�raliser ce dispositif ?

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    �a ne te tente pas, l'utilisation des constructeurs ?

  3. #3
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2007
    Messages
    60
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par d�faut
    La proc�dure qui assigne b.A::v est bien situ�e dans le constructeur de C.

    Le but est de faire en sorte que C<> agisse de mani�re parfaitement transparente pour B, donc notamment pas de code dans le constructeur de B.

  4. #4
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Je dois avouer que je suis un peu paum� dans ton graphe d'h�ritage avec A, B, C et X.

  5. #5
    Membre Expert
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par d�faut
    Citation Envoy� par k1000 Voir le message
    Le but est de faire en sorte que C<> agisse de mani�re parfaitement transparente pour B, donc notamment pas de code dans le constructeur de B.
    Au final le but serait d'avoir
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    struct B : /* virtual */ A, /* private */ C<B, 13> {
     
    };
    Au lieu de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    struct B : /* virtual */ A {
    	B() : A(13) { }
    };
    ?

    Ca me semble une utilisation abusive des templates, �a n'apporte � priori rien, mais augmentera certainement le temps de compilation et la complexit� du code.

  6. #6
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    J'ai du mal � comprendre ce que tu cherches � obtenir, et donc � t'orienter vers une solution.

    Aurais-tu un cas d'usage qui justifie le besoin que tu exprimes (et que j'ai du mal � saisir) ?

  7. #7
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2007
    Messages
    60
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par d�faut
    Citation Envoy� par Iradrille Voir le message
    Au final le but serait d'avoir
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    struct B : /* virtual */ A, /* private */ C<B, 13> {
     
    };
    Au lieu de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    struct B : /* virtual */ A {
    	B() : A(13) { }
    };
    ?
    Oui, c'est bien �a.

    Citation Envoy� par Iradrille Voir le message
    Ca me semble une utilisation abusive des templates, �a n'apporte � priori rien, mais augmentera certainement le temps de compilation et la complexit� du code.
    Je suis d'accord que c'est un capillotract� comme utilisation (c'est d'ailleurs pour �a que probl�me).

    En fait ce pattern me sert dans une biblioth�que :
    - je fournis C<>, qui est en r�alit� une assez grosse classe
    - A et B sont �crites par l'utilisateur (donc je n'ai pas la possibilit� d'ajouter un argument au constructeur de A)

    Je souhaite donc �tre le moins intrusif possible.

    Citation Envoy� par oodini Voir le message
    Aurais-tu un cas d'usage qui justifie le besoin que tu exprimes (et que j'ai du mal � saisir) ?
    Si tu veux la petite histoire : le membre A::v (d'un type bien plus complexe que int), sert en fait d'identifiant de la classe. Cet identifiant est ensuite utilis� pour faire une sorte de switch sur le type dynamique de l'objet cr�� (de mani�re plus efficace qu'une cha�ne de dynamic_cast, et _sans_ avoir besoin de rajouter des fonctions virtuelles).
    Je me rapatrierai sur une autre impl�mentation si je peux d�montrer que c'est impossible. Mais pour l'instant, c'est le design le plus performant que j'aie.

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    OK.

    � pr�sent, r�explique-nous cette histoire de membre v, � la lumi�re de ton dernier message.

  9. #9
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Citation Envoy� par k1000 Voir le message
    Si tu veux la petite histoire : le membre A::v (d'un type bien plus complexe que int), sert en fait d'identifiant de la classe. Cet identifiant est ensuite utilis� pour faire une sorte de switch sur le type dynamique de l'objet cr�� (de mani�re plus efficace qu'une cha�ne de dynamic_cast, et _sans_ avoir besoin de rajouter des fonctions virtuelles).
    Je me rapatrierai sur une autre impl�mentation si je peux d�montrer que c'est impossible. Mais pour l'instant, c'est le design le plus performant que j'aie.
    Hmmm.... L'utilisation d'un switch est rarement justifi�e.
    Je comprend ton envie/besoin d'�viter la virtualit� (bien que tu veuilles utiliser un h�ritage virtuel...), mais as-tu �tudi� le polymorphisme statique (CRTP) ?
    Ou les classes de trait ?

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Utiliser des packages ou des classes pr�sents sur le net
    Par lionrouge dans le forum G�n�ral Java
    R�ponses: 2
    Dernier message: 27/09/2006, 06h09
  2. [WebForms]Ev�nements agissant sur des contr�les
    Par dj_lil dans le forum G�n�ral Dotnet
    R�ponses: 2
    Dernier message: 14/06/2006, 17h47
  3. R�ponses: 6
    Dernier message: 21/05/2006, 20h37
  4. [PHP-JS] form agissant sur 2 pages
    Par splouf dans le forum Langage
    R�ponses: 3
    Dernier message: 16/01/2006, 11h35
  5. Glut / Class / Pointeur sur fonction
    Par areS. dans le forum GLUT
    R�ponses: 5
    Dernier message: 02/12/2005, 20h50

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