En Java, vous pouvez simplement return this
pour obtenir l'objet actuel. Comment faites-vous cela en C++?
Java:
class MyClass {
MyClass example() {
return this;
}
}
Tout d’abord, vous ne pouvez rien retourner d’une fonction void
- return.
Il existe trois manières de renvoyer quelque chose qui donne accès à l'objet actuel: par pointeur, par référence et par valeur.
class myclass {
public:
// Return by pointer needs const and non-const versions
myclass* ReturnPointerToCurrentObject() { return this; }
const myclass* ReturnPointerToCurrentObject() const { return this; }
// Return by reference needs const and non-const versions
myclass& ReturnReferenceToCurrentObject() { return *this; }
const myclass& ReturnReferenceToCurrentObject() const { return *this; }
// Return by value only needs one version.
myclass ReturnCopyOfCurrentObject() const { return *this; }
};
Comme indiqué, chacune des trois manières renvoie l'objet actuel sous une forme légèrement différente. Celui que vous utilisez dépend de la forme dont vous avez besoin.
L'un des principaux avantages de return by reference in classes est la possibilité de Chaîner facilement des fonctions.
Supposons que votre fonction membre consiste à multiplier un membre particulier de votre classe. Si vous créez des fichiers d'en-tête et des fichiers source pour conserver les informations de la classe et la définition de la fonction membre séparément, alors, le fichier d'en-tête myclass.h
serait:
#ifndef myclass_h
#define myclass_h
class myclass{
public:
int member1_;
double member2_;
myclass (){
member1_ = 1;
member2_ = 2.0;
}
myclass& MULT(int scalar);
myclass* MULTP(double scalar);
};
#endif
et le fichier source: myclass.cpp
serait:
myclass& myclass::MULT(int scalar){
member1_ *= scalar;
return *this;
}
myclass* myclass::MULTP(double scalar){
member2_ *= scalar;
return this;
}
Si vous initialisez un objet appelé obj
, le constructeur par défaut ci-dessus définit member1_
égal à 1: Ensuite, dans votre fonction principale, vous pouvez créer des chaînes telles que:
myclass obj;
obj.MULT(2).MULT(4);
Alors member1_
serait maintenant 8. Bien sûr, l’idée pourrait être de chaîner différentes fonctions, Et de modifier différents membres.
Si vous utilisez le retour par pointeur , le premier appel utilise l’objet, Et tout appel suivant traitera le résultat précédent comme un pointeur.
obj.MULTP(2.0)->MULTP(3.0);
Parce que le type de retour est void
, c’est-à-dire que vous déclarez que vous ne renvoyez rien. Changez-le en myclass*
pour renvoyer this
; changez pour myclass &
pour renvoyer une référence à la classe via *this
.