Почему этот код, показывающий ошибку lvalue, требуется в строке 1?Как это решить? - PullRequest
0 голосов
/ 21 декабря 2018
#include<iostream> 
using namespace std; 

class Test 
{ 
  private: 
  int x; 
  public: 
  Test(int x = 0) { this->x = x; } 
  void change(Test *t)
  { 
    this = t; //line 1 
  } 
  void print() { cout << "x = " << x << endl; } 
}; 

int main() 
{ 
  Test obj(5); 
  Test *ptr = new Test (10); 
  obj.change(ptr); 
  obj.print(); 
  return 0; 
} 

, поскольку мы знаем, что этот указатель содержит ссылку на вызывающий объект.В строке 1 я пытаюсь изменить ссылку на вызывающий объект, но он показывает ошибку «lvalue required».Может кто-нибудь объяснить это ??

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Здесь вы назначаете указатель (здесь t) на указатель «this» для определенного объекта. Указатель "this" является постоянным.указатель, который содержит адрес памяти текущего объекта .Вы просто не можете изменить указатель this для объекта, так как, делая это, вы практически будете изменять местоположение объекта в памяти, сохраняя имя таким же.

Ссылка - указатель 'this' вC ++

0 голосов
/ 21 декабря 2018
#include <iostream>
using namespace std;

class Test 
{ 
  private: 
  int x; 
  public: 
  Test(int x=0) 
  {
     this->x = x;
  } 
  void change(Test *t)
  { 
    t->x; //t is a pointer. so make it point to x
  } 
  void print() { cout << "x = " << x << endl; } 
}; 

 int main() 
{ 
 Test obj(5); 
 Test obj1(10); //create a new object
 Test *ptr = &obj1;//make the pointer point to obj1
 obj.change(ptr); //use change() to point to argument of obj1
 obj.print(); //print the value of obj now
 return 0; 
 } 
0 голосов
/ 21 декабря 2018

Вы не можете назначить указатель на указатель this, потому что это prvalue .

this указатель является постоянным указателем, который содержит адрес памятитекущего объекта.В результате, this имеет тип const Test* в вашем случае, поэтому его нельзя назначить.Выполнение этого (если это было разрешено) фактически позволило бы объекту изменять свой собственный адрес в памяти, как упоминал @Peter.

Примечание: const Test* - указатель на постоянный объект.Объект, на который он указывает, является постоянным, а не сам указатель.

PS: this->x = t->x; - это, вероятно, то, что вы хотели сказать.

...