вернуть "это" в C ++? - PullRequest
       12

вернуть "это" в C ++?

14 голосов
/ 03 августа 2011

В Java вы можете просто return this получить текущий объект.Как вы делаете это в C ++?

Java:

class MyClass {

    MyClass example() {
        return this;
    }
}

Ответы [ 3 ]

34 голосов
/ 03 августа 2011

Ну, во-первых, вы не можете ничего вернуть из void -обращающей функции.

Есть три способа вернуть что-то, что обеспечивает доступ к текущему объекту: по указателю, по ссылкеи по значению.

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

Как указано, каждый из трех способов возвращает текущий объект в слегка отличной форме.Какой из них вы используете, зависит от того, какая форма вам нужна.

8 голосов
/ 05 декабря 2012

Одним из основных преимуществ возврата по ссылке в классах является возможность легко цепные функции.

Предположим, что ваша функция-член предназначена для умножения определенного члена вашего класса. Если вы создадите заголовочные и исходные файлы, чтобы хранить информацию о классе и определение функции-члена отдельно, то заголовочный файл myclass.h будет:

#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 

и исходный файл: myclass.cpp будет:

myclass& myclass::MULT(int scalar){
      member1_ *= scalar;
      return *this; 
}
myclass* myclass::MULTP(double scalar){
      member2_ *= scalar;
      return this; 
}

Если вы инициализируете объект с именем obj, конструктор по умолчанию выше устанавливает member1_ равным 1: Затем в вашей основной функции вы можете создавать цепочки, такие как:

myclass obj;
obj.MULT(2).MULT(4);

Тогда member1_ теперь будет 8. Конечно, идея может состоять в том, чтобы связать различные функции, и изменять разных членов.

В случае, если вы используете возврат по указателю , первый вызов использует объект, и любой последующий вызов будет рассматривать предыдущий результат как указатель, таким образом

obj.MULTP(2.0)->MULTP(3.0);
0 голосов
/ 03 августа 2011

Поскольку тип возвращаемого значения void, т.е. вы заявляете, что ничего не возвращаете. Измените его на myclass*, чтобы вернуть this, измените на myclass &, чтобы вернуть ссылку на класс через *this.

...