‘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