Salut,
Envoyé par
Kurisu
même un pointeur constant (const type*) peut se faire caster en non-constant via const_cast<> et donc être modifié.
Si tu veux être sûr pour un pointeur, ca pourrait être un pointeur constant (const type const*).
Sinon, oui, getX en double avec const type& getX() const; et type& getX();
Je ne connais pas l'architecture de ce que tu est en train de préparer, mais il serait peut-être envisageable de repenser le design si tu as autant de types à publier.
A vrai dire, ce qui est vrai pour un pointeur l'est aussi pour une référence... En tout cas, pour le problème que tu soulève...
Rien ne t'empêche de "const_caster" une référence constante en une référence non constante, comme le montre ce code
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
| #include <iostream>
using namespace std;
class A
{
public:
A():i(3){}
~A(){}
int getI() {return i;}/* cette méthode ne peut pas etre utilisee
* sur un objet constant
*/
private:
int i;
/*n'importe quoi */
};
class B
{
public:
B(const A& a):a(a){}
~B(){}
const A& getA() const{return a;}
private:
A a;
};
int main()
{
A myA;
B myB(myA);
const A& recup=myB.getA();
/* ici, on ne peut effectivement pas appeler getI sur recup car c'est
* une référence constante et seulex les méthodes constantes
* peuvent etre appelées sur un objet constant
cout<<recup.getI()<<endl;
*/
A rec2=const_cast<A&>(recup);
cout<<rec2.getI()<<endl;
return 0;
} |
Le code, tel quel, compile et s'exécute exactement comme il le doit
cout<<recup.getI()<<endl;
le code ne compilera même plus sous prétèxte que
main.cpp|31|error: passing 'const A' as 'this' argument of 'int A::getI()' discards qualifiers|
Cependant, si tu décommenter la ligne
Ah oui, tu peux utiliser des macros pour publier plus facilement les variables...
Ca, c'est sans doute la pire idée que l'on ait eu aujourd'hui, et depuis bien longtemps ...
Il faut bien comprendre que les macro préprocesseurs ont un but bien particulier, qui trouve son origine bien avant le début de la compilation elle-même...
Décider d'utiliser les macros pour autre chose que des décisions qui doivent être prise pour "l'ensemble de la compilation" (AKA: supporter les différentes implémentations du compilateur, ou éviter de se retrouver dans une situation où la règle de la définition unique n'est pas respectée) est *rarement* (car il y a effectivement quelques exceptions célèbres) une bonne idée
Partager