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 :

Template & méthode virtuelle


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut Template & méthode virtuelle
    Bonjour,

    Actuellement j'essaye de créer une petite bibliothèque permettant d'encapsuler l'accès aux bases de données.

    Mais je me heurte à un problème pour le résultats des requêtes.

    J'ai une classe résultat qui doit avoir une méthode virtuelle pure permettant d'obtenir une ligne de résultat.
    Je pensais donc retourner un tuple et faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T>
    virtual std::tuple<T> operator[](unsigned int i) = 0;
    Mais on ne peut pas déclarer une méthode template virtuelle :
    erreur : templates may not be 'virtual'

    Que cela ne tienne, il me suffit de créer une classe LigneResultat ainsi qu'une classe ElementResultat et de faire en sorte que Resultat contienne un vector de LigneResultat qui lui-même contienne un vector de ElementResultat.

    Sauf qu'à partir de l'ElementResultat il faut que je puisse le convertir dans le bon type appropriée, conversion qui dépends des bibliothèques d'accès de BDD que j'utilise dans l'implémentation (pqxx pour postgresql, etc...).
    Il faudrait donc que ElementResultat définisse une méthode template abstraite qui serait redéfinie par chaque implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T>
    virtual T as<T>(bool & reussite)= 0;


    Auriez-vous une idée de comment je pourrais procéder?

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bonjour tu as une solution ici http://codepad.org/VVjGIDQL

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Merci pour ta réponse mais je ne vois pas vraiment comment l'utiliser.

    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
    class Resultat
    {
              template <typename Elements>
              std::tuple<Elements> operator[](int i)
              {
                         //creation du tuple
                         //parcours tuple
                                 Type x = getElements<Type>();
                                 //affectation dans le tuple
                         //fin parcours
              }
     
    }
     
    class PSQLResultat : public Resultat{};
     
    class MySQLResultat : public Resultat{};
    Or je vois mal comment récupérer la valeur dans le bon type (getElement) vu que cela dépend de l'implémentation dans PSQLResultat (implémentation pour postgreSQL, les résultats sont stockés sous forme de pqxx::resultat ) et dans MySQLResultat (implémentation pour MySQL, les résultats sont stockés sous forme de ??? ).

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Tu ne peux pas la solution est de poser ton interface puis le template via la classe qui implemente ton interface

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Salut neckara,
    De ce que je comprends tu veux mettre dans l'interface ta méthode de traduction des types, or je pense que celle-ci devrait être implementation-defined puisque dépendant du type de db derrière et donc totalement privée.
    Mon attention se porterait plus sur la création d'une interface commune de données, et non sur la factorisation de leur origine et transformation nécessaire pour y arriver.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par jouana Voir le message
    Tu ne peux pas la solution est de poser ton interface puis le template via la classe qui implemente ton interface
    Mais comment déclarer la méthode de l'interface vu que selon ce que l'utilisateur demande, peut retourner des types différents.

    Salut neckara,
    De ce que je comprends tu veux mettre dans l'interface ta méthode de traduction des types,
    Non, si c'était le cas, je n'aurais aucun problème avec les "virtuel template", je veux traduire la valeur voulue par l'utilisateur dans le type voulu en utilisant la méthode définie dans l'implémentation. Mais l'utilisateur ne doit pas connaître la classe d'implémentation, il doit passer obligatoirement par l'interface.

    Mon attention se porterait plus sur la création d'une interface commune de données, et non sur la factorisation de leur origine et transformation nécessaire pour y arriver.
    L'interface commune de donnée est la classe Resultat mais il faut réussir à faire une méthode virtuelle pure permettant de récupérer les données que l'utilisateur souhaite et là je bloque totalement.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Là où je te perds c'est que pour moi Resultat devrait être le plus haut niveau de ta hiérarchie, et peut alors posséder des méthodes template de transformation, non nécessairement virtual.

    Ou alors tu parles de la traduction "user data" => "db data" pour des ajouts en DB ?
    Dans ce dernier cas, il devrait suffire de proposer des méthodes pour les types "normaux" (string, int, ...).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/10/2010, 11h33
  2. méthodes virtuelles
    Par ep31 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2005, 17h21
  3. classe Template et méthodes "générales"
    Par rulianf dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2005, 13h42
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  5. [C#] Méthode virtuelle
    Par jacma dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2004, 08h18

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