Измените' this ' указатель объекта, чтобы указать другой объект
class C{
//methods and properties
}
void C::some_method(C* b){
delete this;
this = b;
}
это дает мне ошибку follwing при компиляции:
error: lvalue required as left operand of assignment
мое намерение:
Скажем, есть объекты a и b класса C. содержимое класса C может быть очень огромным, а копирование полей может быть очень дорогостоящим. Мне нужно все содержимое "a
'заменить на'b
" экономичным способом.
будет ли конструктор копирования по умолчанию выполнять намеченную задачу?
Я нашел что-то под названием "конструктор перемещения" http://akrzemi1.wordpress.com/2011/08/11/move-constructor/
возможно, он может получить эффект, который я хочу.
6 ответов
на this
-указатель является неявным указателем на объект, в контексте которого вы работаете,вы не можете переназначить его.
согласно Библии Страуструпа (язык программирования C++, 3-е издание у меня есть) this
выражается как
C * const this
означает, что у вас есть постоянный указатель в свой класс C, поэтому компилятор будет жаловаться, если вы попытаетесь изменить его.
EDIT:
как я исправил выше упомянутое выражение не описывает this
полностью правильно, для this
фактически является rvalue.
цитирую стандарт:
в теле нестатической функции-члена (9.3) ключевое слово
this
является выражением prvalue, значение которого является адресом объект, для которого вызывается функция.
"prvalue" является чистым rvalue, что-то вроде 42
или 3.14159
.
Точно так же вы не можете сделать что-то вроде 42 = x
, вы не можете
назначить this
; в обоих случаях (по крайней мере, концептуально), есть
нет объекта, значение которого может изменение.
и мне действительно интересно, что вы ожидаете, если Я пишу что-то вроде:
int
main()
{
C c1;
C c2
c1.some_method( &c2 );
}
вы ожидаете адрес c1
каким то чудом
перемены, и для c1
и c2
быть псевдонимы одного и того же объекта?
(И c1.some_method( NULL )
еще более intreguing.)
вы не можете назначить другое значение this
поскольку он указывает на сам объект, и это не имеет никакого смысла.
Вы можете создать экземпляр нового объекта и вместо этого использовать его неявный указатель this.
кроме того, если вы попытаетесь сделать копию объекта, вы можете перезаписать operator=
class Foo
{
public:
[...]
Foo& operator=(const Foo& foo);
}
int main()
{
Foo foo;
foobar = foo; //invoke operator= overwrited method
}
ошибка говорит: "Вы не можете назначить b
до this
". Насколько мне известно, this
это то, что вы не можете изменить, потому что это не фактический указатель, а само-ссылка.
просто используйте обычный подход вместо черной магии и UB:
C* c1 = new C();
C* c2 = new C();
// do some work perhaps ...
delete c1;
c1 = c2;
теперь c1-это псевдоним c2, как вы хотели. Будьте осторожны, хотя при очистке памяти, так что вы не в конечном итоге удаление объекта дважды. Возможно, вы могли бы рассмотреть умные указатели...