В Java вы можете просто return this
получить текущий объект. Как вы это делаете в С++?
Java:
class MyClass {
MyClass example() {
return this;
}
}
В Java вы можете просто return this
получить текущий объект. Как вы это делаете в С++?
Java:
class MyClass {
MyClass example() {
return this;
}
}
Ну, во-первых, вы не можете вернуть ничего из функции 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; }
};
Как указано, каждый из трех способов возвращает текущий объект в несколько иной форме. Какой из них вы используете, зависит от того, какую форму вам нужно.
Одним из основных преимуществ возврата по ссылке в классах является способность легко цепные функции.
Предположим, что ваша функция-член должна умножить определенный член вашего класса. Если вы хотите, чтобы формат заголовка и исходных файлов сохранял информацию о классе и определении функции-члена по-разному, тогда: Заголовочный файл 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);
Поскольку тип возврата void
, т.е.: вы заявляете, что ничего не возвращаете. Измените его на myclass*
, чтобы вернуть this
изменить на myclass &
, чтобы вернуть ссылку на класс через *this
.