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 :

property accessor comme en C#


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut property accessor comme en C#
    ‘yo

    Je suis débutant en CPP (peut être 30h)

    Dans la plupart des langages de programmation, il existe la «notion» de «property»
    par exemple en C# (code fictif: je ne sais pas coder en C#)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Maclass{
    	string nom {
    		set=>{...code a executer si «nom» est modifié…}
    		get=>{...code a executé si «nom» est consulté…}
    	}
    …
    Maclass monobj*;
    monobj.nom="foxz" // appellera la fonction «set»
    print monobj.nom //appellera la fonction «get»
    pourquoi ne pas porter ce concept en CPP?

    Si dessus ma proposition de code.
    (qui marche plutôt bien...)
    A terme la class prop sera une lib.

    Explications du code en fin.
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <iostream>
     
    using namespace std;
     
    template<class C, typename T>
    class prop{
        public:
            T value;
            typedef T (C::*tdsetter)(T i);
            tdsetter setter;
            typedef T (C::*tdgetter)();
            tdgetter getter;        
     
            C *slf;
            prop(C *v,tdsetter set,tdgetter get){
                setter=set;
                getter=get;
                slf=v;
            }
            operator T(){
                return (slf->*getter)();
            }
            T operator= (T val){
                value=(slf->*setter)(val);
                return value;
            }
            T* operator->(){
                value=(slf->*getter)();
                return &value;
            }  
    };
     
    class C{
        public:
            int cx=0;
    };
     
    class B{
        private:
            int iset(int i){
                cout <<"B::iset"<<endl;
                return i;
            }
            int iget(){
                cout <<"B::iget"<<endl;
                return inttst.value;
            }
            string sset(string s){
                cout <<"B::sset"<<endl;
                return s;
            }
            string sget(){
                cout <<"B::sget"<<endl;
                return strtst.value;
            }
            C cset(C val){
                cout <<"B::cset"<<endl;
                return val;
            }
            C cget(){
                cout <<"B::cget"<<endl;
                return ctst.value;
            }
        public:
            prop<B,int> inttst={this,&B::iset,&B::iget};
            prop<B,string> strtst={this,&B::sset,&B::sget};
            prop<B,C> ctst={this,&B::cset,&B::cget};
    };
     
    int main(int argc, char** argv){
        B b;
        b.inttst=15;
        b.strtst="hello";
        b.ctst->cx=8;
        cout << b.inttst << endl;
        cout << b.strtst->size() << endl;
        cout << b.ctst.value.cx << endl;
    }
    la class C est un test de type de property.
    La class B est la class contenant des property

    ligne):comment
    9) je n’arrive pas a ecrire de usign avec des class functor
    65) on declare 3 property
    prop <class contenante, type>nom={this, $functor_set,$functor_get}
    (j’ai peut être trouvé le moyen de ne pas déclarer la class contenante en passant par un cast que je ne sais pas encore bien faire en CPP)
    on passe le this pour le context de callback (prop::operator doit connaître le this du context en cours)
    (celui qui est passé dans la declaration prop...={this,…]) et concervé dans "self"

    pour le «set» je passe par l’operator=
    pour le «get» je passe par l’operator de «transtypage» (je sais c’est sale mais je n’ai pas trouvé mieux)

    72) affichera «B::iset» et le this sera celui de B::
    74) comme on ne peux pas surcharger l’operator «.» j’utilise l’operator ->
    pour accéder au contenu de C. (bien que b.ctst ne soit pas un pointer)
    (c’est un peu sale mais je n’ai pas trouvé mieux)
    idem pour la fonction strtst.length()… il faut ecrire strtst->length()...
    au finale je sais que les vieux barbus du CPP trouverons ce code totalement unuseful…
    je donne ici ce code a toute fin utile

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    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 152
    Billets dans le blog
    4
    Par défaut
    Je vois pas trop la "fin utile" de complexifier le code par du template et diminuer le temps de compilation voire d'exécution pour avoir une syntaxe au mieux bancale, plus lourde, de code bloat.
    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
    class A
    {
    public:
      void SetA(int newA)
      {
        a = newA;
        // Code à exécuter si a est modifié
      }
      int GetA() const
      {
        // Code à exécuter si a est consulté
       return a;
      }
    private:
      int a;
    };
    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.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Je vois pas trop la "fin utile" de complexifier le code par du template et diminuer le temps de compilation voire d'exécution pour avoir une syntaxe au mieux bancale, plus lourde, de code bloat.
    parce que c'est fun...

    question lourdeur, c'est a discuter... en bloat tu dois rajouter des settruc gettruc a chaque utilisation.
    bon question compilo c'est sur c'est plus lent... (pardon g un 4xI7core 4ghz 32go)
    a priori je pense qu'en terme d'exe ca doit etre la meme chose a un call (+poussiere) pret

    bloat.set(bloat.get()++).... c'est plus leger que prop++ ?
    (2 call) ....... (3 call en mode fleme)

    <saccasm>
    du coup, tu fais comment pour utiliser les vector sans le templating ?
    </saccasm>

    pour la syntax j'ai trouvé le moyen de me debarasser de la declaration de la class contenante dans la declaration du prop
    mais au prix d'un cast que n'aime pas les vieux routier du cpp.

    ca donnerais juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class B::public props {
    prop<int>mavar={this, (props)&::set,(pros)&::get}
    (lj'y travail...)

    parait qu'il faut utiliser le casting CPP mais je ne trouve pas d'exemple
    qui correspond a mon cas d'utilisation.
    je dois chercher du coté de dynamic_cast toutim non ? ou bien ?

    <saccasm>
    c'est bien dommage d'avoir un langage aussi puissant pour faire du C avec qq poussieres de POO.
    </saccasm>

    peux tu m'aidé pour ecrire l'usign pour mon typedef ?
    je ne trouve pas d'exemple avec un class functor..
    usign tdsetter=void(class::*)(int) ?

    cinqU

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    J'ai écrit un code simple qui fait la même chose que ton exemple (KISS) :

    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
    20
    class C{
        public:
            int cx=0;
    };
    class B{
        public:
            int inttst;
            string strtst;
            C ctst;
    };
     
    int main(int argc, char** argv){
        B b;
        b.inttst=15;
        b.strtst="hello";
        b.ctst.cx=8;
        cout << b.inttst << endl;
        cout << b.strtst.size() << endl;
        cout << b.ctst.cx << endl;
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    J'ai écrit un code simple qui fait la même chose que ton exemple (KISS) :
    Okkeeyyy...

    le but d'un property est de déclencher un "évènement"...
    dans mon exemple je ne fais qu'un cout... mais rien n'empêche d'y mettre un code wizz...

    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class  fenetre
     prop<string>title={this, ;.. toutim...}
    déclenchera le "toutin" sur un mafentre.titre="mon titre"...
    comme si tu avais un bloat settile mais sans la "lourdeur" du bloat.


    comme je disais, le concept de property existe dans d'autre langage
    même si je n'ai aucune idée de la freq d'utilisation en C# par ex.
    ca existe... c'est possible de le faire en cpp. ca évite de balader des
    set/get. En surchargeant les operator qui vont bien tu pourra faire
    prop++. avec un bloat il faudra écrire bloat.set(bloat.get()++)...
    moi ca, ca me pique les yeux...

    5u

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par foxzoolm Voir le message
    (...) ca evite de ballader des
    set/get. En surchargant les operator qui vont bien tu pourra faire
    prop++. avec un bloat il faudra ecrire bloat.set(bloat.get()++)...
    moi ca, ca me pique les yeux...
    Moi aussi ça me pique les yeux, mais du coup on perd la notion de "service" qu'une classe doit proposer.
    Si on veut que la classe expose le service "incrémente le compteur", on écrit une fonction pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
      ...
     
      int incCompteur()
      {
        return bloat++;
      }
    };
    C'est ce qui fait que je pense que les propriétés sont une mauvaise idée (comme les getters/setters), ils font réfléchir en termes de données plutôt qu'en termes de services fournis, et à ce moment passer par des membres publics reste la meilleure solution.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    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 152
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par foxzoolm Voir le message
    déclenchera le "toutin" sur un mafentre.titre="mon titre"...
    comme si tu avais un bloat settile mais sans la "lourdeur" du bloat.


    comme je disais, le concept de property existe dans d'autre langage
    meme si je n'ai aucune idée de la freq d'utilisation en C# par ex.
    ca existe... c'est possible de le faire en cpp. ca evite de ballader des
    set/get. En surchargant les operator qui vont bien tu pourra faire
    prop++. avec un bloat il faudra ecrire bloat.set(bloat.get()++)...
    moi ca, ca me pique les yeux...

    5u
    Je crois que t'as pas compris ce que code bloat signifie.
    Si écrire toto.setTruc te fatigue, je conseille d'arrêter immédiatement la programmation, ça sera plus simple.
    Si tu aimes tant le C#, fais donc du C#.
    C++ n'a pas non plus de GC, est-ce que ça manque ? Non.
    Tu peux continuer à écrire du mauvais code template totalement inutile, mais sois pas surpris quand on dit qu'il est inutile. Et inutile de te cacher derrière des "ho ça va pas plaire aux dinosaures du C++", parce qu'en fait au mieux on s'en fout royal, mais on va sûrement pas laisser ça comme étant une "bonne pratique".

    c'est bien dommage d'avoir un langage aussi puissant pour faire du C avec qq poussieres de POO.
    Bah fais donc du C++ et non du C with classes, puis on en reparlera.
    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.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/12/2016, 11h11
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  4. Afficher/Masquer un bouton comme IE 6
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/07/2002, 13h12
  5. Réponses: 3
    Dernier message: 19/07/2002, 15h01

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