Измените' 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.


вы не можете изменить то, что this указывает. Я также не знаю, зачем тебе это нужно.


цитирую стандарт:

в теле нестатической функции-члена (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, как вы хотели. Будьте осторожны, хотя при очистке памяти, так что вы не в конечном итоге удаление объекта дважды. Возможно, вы могли бы рассмотреть умные указатели...