CObject*& getter_label(CObject* owner) {
return
static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
}
CObject*& getter_label(CObject* owner) {
return
static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
}
CObject*& getter_label(CObject* owner) {
return
static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
}
CObject*& getter_label(CObject* owner) {
return
static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
[BCC32 Erreur]
CObject*& getter_label(CObject* owner) {
return
static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
[BCC32 Erreur]
CObject*& getter_label(CObject* owner) {
return
static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
[BCC32 Erreur]
Je vois au moins une couille dans ce code.
Ton code est équivalent à :
CObject*& getter_label(CObject* owner)
{
CObject* temp= static_cast<CObject*>(...
return temp;
}
Tu crées un objet temporaire (de type "pointeur vers CObject"), qui va
être détruit à la fin de la fonction.
Donc, tu ne peux pas renvoyer une référence vers ce pointeur,
puisqu'il n'existe plus.
La solution : renvoyer le pointeur, pas une référence vers ce
pointeur.
CObject* getter_label(CObject* owner)
{ ...
Je vois au moins une couille dans ce code.
Ton code est équivalent à :
CObject*& getter_label(CObject* owner)
{
CObject* temp= static_cast<CObject*>(...
return temp;
}
Tu crées un objet temporaire (de type "pointeur vers CObject"), qui va
être détruit à la fin de la fonction.
Donc, tu ne peux pas renvoyer une référence vers ce pointeur,
puisqu'il n'existe plus.
La solution : renvoyer le pointeur, pas une référence vers ce
pointeur.
CObject* getter_label(CObject* owner)
{ ...
Je vois au moins une couille dans ce code.
Ton code est équivalent à :
CObject*& getter_label(CObject* owner)
{
CObject* temp= static_cast<CObject*>(...
return temp;
}
Tu crées un objet temporaire (de type "pointeur vers CObject"), qui va
être détruit à la fin de la fonction.
Donc, tu ne peux pas renvoyer une référence vers ce pointeur,
puisqu'il n'existe plus.
La solution : renvoyer le pointeur, pas une référence vers ce
pointeur.
CObject* getter_label(CObject* owner)
{ ...
BCB 2010, donc pas trop vieux.
CObjectFieldBase dérive de CObject
CObject*& getter_label(CObject* owner) {
... static_cast<CObjectFieldBase*>(owner)
J'ai besoin d'une référence vers le pointeur d'origine, car je veux à partir
du retour de fonction pouvoir changer l'objet pointé "à l'emplacement
désigné
BCB 2010, donc pas trop vieux.
CObjectFieldBase dérive de CObject
CObject*& getter_label(CObject* owner) {
... static_cast<CObjectFieldBase*>(owner)
J'ai besoin d'une référence vers le pointeur d'origine, car je veux à partir
du retour de fonction pouvoir changer l'objet pointé "à l'emplacement
désigné
BCB 2010, donc pas trop vieux.
CObjectFieldBase dérive de CObject
CObject*& getter_label(CObject* owner) {
... static_cast<CObjectFieldBase*>(owner)
J'ai besoin d'une référence vers le pointeur d'origine, car je veux à partir
du retour de fonction pouvoir changer l'objet pointé "à l'emplacement
désigné
Puisque CObjectFieldBase dérive de CObject, il faudrait plutôt un
dynamic_cast<> ici, non ?
En fait, tu as une fonction "get" qui te sert à faire un "set".
En gros, le système de types de C++ ne fonctionne plus. Ce qui
signifie que tu l'as cassé. Et comme la seule façon de casser le
système de types de C++ est d'utiliser reinterpret_cast<>, tu as
forcément un reinterpret_cast<> dans ta fonction getter_label().
Note que, puisque tu abandonnes le système de types, tu pourrais aussi
bien utiliser des void* :
Puisque CObjectFieldBase dérive de CObject, il faudrait plutôt un
dynamic_cast<> ici, non ?
En fait, tu as une fonction "get" qui te sert à faire un "set".
En gros, le système de types de C++ ne fonctionne plus. Ce qui
signifie que tu l'as cassé. Et comme la seule façon de casser le
système de types de C++ est d'utiliser reinterpret_cast<>, tu as
forcément un reinterpret_cast<> dans ta fonction getter_label().
Note que, puisque tu abandonnes le système de types, tu pourrais aussi
bien utiliser des void* :
Puisque CObjectFieldBase dérive de CObject, il faudrait plutôt un
dynamic_cast<> ici, non ?
En fait, tu as une fonction "get" qui te sert à faire un "set".
En gros, le système de types de C++ ne fonctionne plus. Ce qui
signifie que tu l'as cassé. Et comme la seule façon de casser le
système de types de C++ est d'utiliser reinterpret_cast<>, tu as
forcément un reinterpret_cast<> dans ta fonction getter_label().
Note que, puisque tu abandonnes le système de types, tu pourrais aussi
bien utiliser des void* :
CObject*& getter_label(CObject* owner) {
return static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
CObject*& getter_label(CObject* owner) {
return static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
CObject*& getter_label(CObject* owner) {
return static_cast<CObject*>(static_cast<CObjectFieldBase*>(owner)->label_);
> Je vois au moins une couille dans ce code.
> Ton code est équivalent à :
> CObject*& getter_label(CObject* owner)
> {
> CObject* temp= static_cast<CObject*>(...
> return temp;
> }
> Tu crées un objet temporaire (de type "pointeur vers CObject"), qui v a
> être détruit à la fin de la fonction.
> Donc, tu ne peux pas renvoyer une référence vers ce pointeur,
> puisqu'il n'existe plus.
C'est ce que je constate et justement, je ne comprends pas pourquoi un
temporaire est créé !
Pour moi, un static_cast, c'est simplement un cast effectué à
la compilation dans une hiérarchie. Je ne vois pas pourquoi
un temporaire serait créé.
Déjà, mon compilateur - BCB 2010 - n'accepte pas la syntaxe
CObject*& getter_label(CObject* owner) {
return static_cast<CObjectFieldBase*>(owner)->label_;}
qui correspond à l'initialisation de la référence à partir
d'un pointeur de classe dérivée et m'oblige à un static_cast
supplémentaire.
> La solution : renvoyer le pointeur, pas une référence vers ce
> pointeur.
> CObject* getter_label(CObject* owner)
> { ...
J'ai besoin d'une référence vers le pointeur d'origine, car je veux à partir
du retour de fonction pouvoir changer l'objet pointé "à l'emplacement
désigné", ce qui n'est pas possible si je retourne un simple pointeur .
En gros, tu l'as sans doute compris, label est une propriété
d'objet implémentée sous la forme d'un pointeur alloué dans le
tas. Ce getter me retourne la propriété que je dois pouvoir
modifier (et pas seulement lire). Si je retourne un CObject*,
j'aurais une simple copie du pointeur...
Si static_cast effectue une copie, il va falloir que je mette
des reinterpret_cast partout ! (et j'espère que
reinterpret_cast ne fait pas de copie, enfin je ne pense pas
!) Mais c'est vraiment une surprise pour moi, et je trouve ce
comportement pas très pratique...
> Je vois au moins une couille dans ce code.
> Ton code est équivalent à :
> CObject*& getter_label(CObject* owner)
> {
> CObject* temp= static_cast<CObject*>(...
> return temp;
> }
> Tu crées un objet temporaire (de type "pointeur vers CObject"), qui v a
> être détruit à la fin de la fonction.
> Donc, tu ne peux pas renvoyer une référence vers ce pointeur,
> puisqu'il n'existe plus.
C'est ce que je constate et justement, je ne comprends pas pourquoi un
temporaire est créé !
Pour moi, un static_cast, c'est simplement un cast effectué à
la compilation dans une hiérarchie. Je ne vois pas pourquoi
un temporaire serait créé.
Déjà, mon compilateur - BCB 2010 - n'accepte pas la syntaxe
CObject*& getter_label(CObject* owner) {
return static_cast<CObjectFieldBase*>(owner)->label_;}
qui correspond à l'initialisation de la référence à partir
d'un pointeur de classe dérivée et m'oblige à un static_cast
supplémentaire.
> La solution : renvoyer le pointeur, pas une référence vers ce
> pointeur.
> CObject* getter_label(CObject* owner)
> { ...
J'ai besoin d'une référence vers le pointeur d'origine, car je veux à partir
du retour de fonction pouvoir changer l'objet pointé "à l'emplacement
désigné", ce qui n'est pas possible si je retourne un simple pointeur .
En gros, tu l'as sans doute compris, label est une propriété
d'objet implémentée sous la forme d'un pointeur alloué dans le
tas. Ce getter me retourne la propriété que je dois pouvoir
modifier (et pas seulement lire). Si je retourne un CObject*,
j'aurais une simple copie du pointeur...
Si static_cast effectue une copie, il va falloir que je mette
des reinterpret_cast partout ! (et j'espère que
reinterpret_cast ne fait pas de copie, enfin je ne pense pas
!) Mais c'est vraiment une surprise pour moi, et je trouve ce
comportement pas très pratique...
> Je vois au moins une couille dans ce code.
> Ton code est équivalent à :
> CObject*& getter_label(CObject* owner)
> {
> CObject* temp= static_cast<CObject*>(...
> return temp;
> }
> Tu crées un objet temporaire (de type "pointeur vers CObject"), qui v a
> être détruit à la fin de la fonction.
> Donc, tu ne peux pas renvoyer une référence vers ce pointeur,
> puisqu'il n'existe plus.
C'est ce que je constate et justement, je ne comprends pas pourquoi un
temporaire est créé !
Pour moi, un static_cast, c'est simplement un cast effectué à
la compilation dans une hiérarchie. Je ne vois pas pourquoi
un temporaire serait créé.
Déjà, mon compilateur - BCB 2010 - n'accepte pas la syntaxe
CObject*& getter_label(CObject* owner) {
return static_cast<CObjectFieldBase*>(owner)->label_;}
qui correspond à l'initialisation de la référence à partir
d'un pointeur de classe dérivée et m'oblige à un static_cast
supplémentaire.
> La solution : renvoyer le pointeur, pas une référence vers ce
> pointeur.
> CObject* getter_label(CObject* owner)
> { ...
J'ai besoin d'une référence vers le pointeur d'origine, car je veux à partir
du retour de fonction pouvoir changer l'objet pointé "à l'emplacement
désigné", ce qui n'est pas possible si je retourne un simple pointeur .
En gros, tu l'as sans doute compris, label est une propriété
d'objet implémentée sous la forme d'un pointeur alloué dans le
tas. Ce getter me retourne la propriété que je dois pouvoir
modifier (et pas seulement lire). Si je retourne un CObject*,
j'aurais une simple copie du pointeur...
Si static_cast effectue une copie, il va falloir que je mette
des reinterpret_cast partout ! (et j'espère que
reinterpret_cast ne fait pas de copie, enfin je ne pense pas
!) Mais c'est vraiment une surprise pour moi, et je trouve ce
comportement pas très pratique...