Je me déplace à partir de Java-C++ et je suis un peu confus de la langue de la flexibilité. Un point est qu'il existe trois façons de stocker des objets: Un pointeur, une référence et un scalaire (stockage de l'objet lui-même, si je comprends bien).
J'ai tendance à utiliser des références si possible, parce que c'est proche de Java que possible. Dans certains cas, par exemple, des getters pour les dérivés attributs, ce n'est pas possible:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
Cela ne veut pas compiler, car t
il n'existe que dans le champ d'application de l' getSomeAttribute()
et si je retourne une référence à elle, elle aurait point de nulle part avant que le client puisse l'utiliser.
Donc je suis parti avec deux options:
- Retourner un pointeur
- De retour d'un scalaire
Retournant un pointeur devrait ressembler à ceci:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
Ce serais de travail, mais le client devra vérifier ce pointeur pour NULL
afin d'être vraiment sûr, quelque chose qui n'est pas nécessaire avec les références. Un autre problème est que l'appelant aurait assurez-vous que t
est libéré, je préfère ne pas traiter que si je peux l'éviter.
L'alternative serait de revenir à l'objet lui-même (scalaire):
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
C'est assez simple et tout ce que je veux dans ce cas: Il se sent comme une référence et il ne peut pas être null. Si l'objet est hors de portée dans le code du client, il est supprimé. Assez pratique. Cependant, j'ai rarement vu quelqu'un le faire, est-il une raison pour que? Est-il une sorte de problème de performance si je retourne un scalaire au lieu d'un pointeur ou une référence?
Ce qui est le plus commun/approche élégante pour gérer ce problème?