Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Aide avec les template: comment implémenter élégamment une propriété avec getter/setter en C++? [ Divers / Général ] (Forman)

samedi 5 avril 2008 à 16:20:54 | Aide avec les template: comment implémenter élégamment une propriété avec getter/setter en C++?

Forman

Bonjour à tous,

je n'ai pas commencé le C++ depuis très longtemps donc désolé si ma question parait trop naïve. J'ai cherché à de nombreux endroits une réponse appropriée mais n'ai rien trouvé.

Voici ce que je veux réaliser: étant donnée une classe donnée (dans ce qui suit je l'appelle "window"), je voudrais la doter facilement de propriétés qui redéfinissent certains opérateur en simplifiant au maximum leur usage, que ce soit pour celui qui écrit la classe ou pour celui qui l'utilise. Le but est de définir une classe template "property" qui ressemblerait à peu près à ça:

template <class T,T Default,class U,T (U::*getter)(void),void (U::*setter)(T value)> class property {
  /* Ici redéfinition des opérateurs d'affectation et transtypage utilisant les méthodes getter et setter de la classe parent "U"  */
}

Exemple d'utilisation:

class window {
  private:
    HWND Handle;
 
  protected:
    int getWidth(void);
    void setWidth(const int width);

  public:
    property<int,50,window,getWidth,setWidth> Width; /* Ici 50 c'est la valeur par défaut qui sert à initialiser la propriété */
}


Evidemment, property<T,...> redéfinirait les opérateurs d'affectation d'une valeur const T et de transtypage vers le type T,etc...  pour pouvoir utiliser le tout ainsi:

window w;
int largeur=w.width;
w.width=500;

Le principe est semblable aux déclarations de propriétés (property Width:Integer read getWidth write setWidth default 50;) de Delphi, pour ceux qui connaissent. Evidemment, les setter et getter utilisés doivent pouvoir référencer les membres privés de window puisqu'ici on souhaiterait accéser au champ Handle, par exemple avec les API SetWindowPos ou autres.

Ma question est: comment implémenter ce fameux template? Bien évidemment ce que j'ai écrit ici ne fonctionne pas, puisqu'il faudrait donner une référence à this dans les spécifications du template, ce qui n'est pas possible à ma connaissance.

Je voudrais pouvoir me dispenser d'avoir à donner des paramètres dans le constructeur de la propriété, afin de conserver les facilités d'écriture et d'utilisation des objets automatiques. Bien sûr, il serait possible de passer les méthodes de classe this->getWidth et this->setWidth au moment du constructeur de window à Width, mais là encore j'aimerais pouvoir m'en dispenser si c'est possible, de façon à ce que la définition d'une propriété puisse se faire en une ligne en utilisant judicieusement les facilités des templates. Eventuellement si c'était possible de le faire (toujours en une ligne!) avec une macro, je suis preneur aussi.

Autre piste avec macro que j'ai un peu explorée: en définissant une struct localement à l'intérieur de la classe window, il est possible de faire référence (à l'intérieur des méthodes membres de la struct) aux champs de la classe window.... à condition que ceux-ci soient static, ce qui est une sérieuse limitation! Je suis en train d'essayer de voir s'il n'est pas possible de définir une classe descendante de window à l'intérieur même de window, qui se chargerait de faire le travail.

J'espère que mes explications sont suffisamment claires. Merci d'avance à tout gourou du C++ qui pourrait m'aider, la récompense sera mon admiration éternelle de sa maîtrise du langage


samedi 5 avril 2008 à 17:50:27 | Re : Aide avec les template: comment implémenter élégamment une propriété avec getter/setter en C++?

juju12

Si tu utilises Visual C++ tu peux le faire avec __declspec(property).
explications et exemple sur MSDN :
[ Lien ]

samedi 5 avril 2008 à 18:06:50 | Re : Aide avec les template: comment implémenter élégamment une propriété avec getter/setter en C++?

Forman

Merci, je ne connaissais pas, mais d'après ce que je lis c'est spécifique à Microsoft... dommage car ça a l'air bien pratique à utiliser!

Je cherche plutôt une solution utilisant uniquement le langage C++ et pas des extensions propriétaires (c'est pour faire du code multiplateforme).




Cette discussion est classé dans : possible, classe, window, template, width


Répondre à ce message

Sujets en rapport avec ce message

Erreur de link en utilisant les templates [ par Wett ] Voila j'utilise VC++ 6 et j'ai créé une classe templates toute simple (en fait c une liste chainée :p), de la formedans le .h:template class ChainList template dll ou autre??? [ par Bilock ] Bonjour,j'aimerai créer un programme chargeant des dll de traitement audio temps réel.J'aimerai que ces dll contiennent une classe que je puisse insta template? [ par payen ] Salut a tous,je programme actuellement une bibli de traitement d'images en C++, et j'ai un p'tit souci. En fait, j'ai cree une classe image qui contie classe derivee de template [ par payen ] Salut a tous,juste une petite question sur les template et les classes derivees ... j'ai donc une classe template declarre comme suit: template [ par ifren ] salutje veux utilise une classe D utilisant une variable qui peut etre double ou string, je deirve de cette dernier deux autre class Dnum et Dstrpour template et héritage [ par cybermax62 ] j'ai un problème de fond dans ma conception. Je voudrais utiliser une classe template de base Singleton avec des classes héritées (plusieurs fois). Le pb d'importation d'une classe template à partir d'une DLL avec Visual Studio .NET [ par Diabolus ] Salut,J'ai un problème d'importation à partir d'une DLL.Je souhaite importer une classe qui est de type template dans mon application.J'ai réussi à im une file Template dans un Vecteur Template [ par grand_duck ] voici le problème j'ai une classe de vecteur template et une classe de file template je voudrais mettre ma file template dans mon vecteur est-ce possi Unresolved external symbol [ par neodelphi ] Bonsoir, c'est encore moi et mes problèmes de c++ !Je vais essayer de faire cour:J'ai une classe template dans un fichier .hpp (déclaration & code). C class et fichier [ par lilington ] salut j'ai 2 questions: 1- est il possible de stocker une classe dans un fichier comme on ferai pour une structure? par exemple si je fais un carnet d


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,593 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.