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 :

Comment surcharger une API


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut Comment surcharger une API
    Bonjour à tous,

    Voici ma problématique:
    Je souhaite créer une dll de Base à tous mes projets, appelons là Common.
    Bien-sur, je ne vais pas réinventer la std ou autre lib.

    J'aimerai justement choisir une api (Poco ou Qt dans mon cas) et surcharger toutes les classes que je risque d'utiliser dans mes projets.

    Mes projets ne doivent pas avoir connaissance de l'api choisie. Ce qui me permettra dans le futur de changer facilement d'api par une autre en modifiant seulement le projet Common.


    Quelle est la meilleur méthode?
    - utiliser des #define dans tous les sens
    - surcharger les classes qui m'interesse
    J'opte pour le moment pour la 2eme solution

    Je rencontre le souci suivant:
    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
     
    Fichier MaClasseSurchargee.h
     
     
    #include "API/NamespaceA/ClasseA.h"
     
    namespace Common
    {
    	namespace NamespaceA
    	{
    		class Common_API ClasseA: public API::NamespaceA::ClasseA
    		{
    		};
     
    	} //NamespaceA
    } //Common
    Si j'inclue MaClasseSurchargee dans un autre projet de plus haut niveau.
    Ce projet à besoin de savoir où se trouve:
    "API/NamespaceA/ClasseA.h"
    Et je ne veux pas lui donner l'info

    Et malheureusement je ne peux pas écrire:
    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
     
    namespace API
    {
    	namespace NamespaceA
    	{
    		class ClassA;
    	}
    }
     
    namespace Common
    {
    	namespace NamespaceA
    	{
    		class Common_API ClasseA: public API::NamespaceA::ClasseA
    		{
    		};
     
    	} //NamespaceA
    } //Common


    Comment m'en sortir?
    Je suis sur qu'il y a une solution simple.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Une solution que je propose, c'est de créer une classe "Contexte" dans laquelle les fonctions que vous voulez, sont.
    Cette classe pourra être hériter, soit par ContexteQt, soit par ContextePoco. Ainsi, le programme ne jouera que avec l'interface Contexte et n'aura guère à se soucier si c'est du Qt ou du Poco.

    Il existe une méthode similaire, reposant sur les templates, en place de l'héritage (classe de politique, je crois).

    Sinon, en gros bourrin (que je déconseille), vous faites deux fois la même implémentation (la même classe / même fonction), une pour Poco et une pour Qt et vous incluant, soit l'une, soit l'autre (en jouant sur un #ifdef qui englobe les #include).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    Merci de ta réponse,

    Mais je cherche encore.

    Ta première solution convient, si on ne souhaite utiliser que quelques méthodes de l'API de base, mais pour redéfinir une API complète je ne pense pas que soit la meilleur solution.
    Énormément de classes et surtout de méthodes à réécrire, sans parler de l'héritage interne de l'API.


    Je ne connaissais pas le concept des classes politiques, ou des classes traits, malgré qu'on les utilises souvent.
    Petit lien pratique pour savoir ce que c'est: http://alp.developpez.com/tutoriels/traitspolicies/
    D'un premier regard, je pense que je vais vite être coincé
    Je regarde plus en profondeur, voir si je peux m'en sortir.


    La dernière solution, comme tu les dis est a déconseillé.



    Bon je cherche toujours.
    Si je trouve une solution qui convient je posterai ma solution ici.



    Je précise que je ne veux pas utiliser les 2 API en même temps.
    C'est juste pour prévoir l'avenir. Lorsque les solutions évoluent et que d'énorme projets repose dessus et que l'on change l'API de base, tous les projets doivent être réécris. Je veux juste ajouter une couche d'abstraction à l'API de plus bas niveau.
    (Exemple, d'anciens projets écrit en boost que l'on veux passer à Poco ou Qt.(Ce n'est qu'un exemple))

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Pour ce que vous faites (pouvoir changer une API de base), il faut une abstraction. L'abstraction, c'est le rajout d'une couche, entre votre application et l'API sous jacente.
    Il n'y a pas grand choix de faire des surchages de chaque fonctions. Cela peut même être fait automatique avec un script ou un programme.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    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
    Les classes de politique sont une bonne solution.

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/04/2007, 11h41
  2. Réponses: 5
    Dernier message: 18/07/2006, 12h10
  3. Comment exécuter une API windows via php ?
    Par mikemead dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 31/03/2006, 10h19
  4. Comment faire une API Win32 avec C++ Builder
    Par Zerocool003 dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/01/2006, 16h13
  5. Surcharger une API
    Par Crisanar dans le forum C++
    Réponses: 6
    Dernier message: 02/09/2005, 16h00

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