Подтвердить что ты не робот

Return "this" в С++?

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

Java:

class MyClass {

    MyClass example() {
        return this;
    }
}
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Предположим, что ваша функция-член должна умножить определенный член вашего класса. Если вы хотите, чтобы формат заголовка и исходных файлов сохранял информацию о классе и определении функции-члена по-разному, тогда: Заголовочный файл 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; 
}

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

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

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

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

class.MULTP(2.0)->MULTP(3.0);

Ответ 3

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