web-dev-qa-db-fra.com

renvoyer "ceci" en C++?

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;
    }
}
14
nobody

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.

32
Robᵩ

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);
8
lucky85dog

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.

0
littleadv