【问题标题】:Why this code showing an error lvalue required in line 1? How to resolve it?为什么此代码显示第 1 行所需的错误左值?如何解决?
【发布时间】:2018-12-21 07:54:32
【问题描述】:
#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 行中,我试图更改调用对象的引用,但它显示错误“需要左值”。有人可以解释一下吗?

【问题讨论】:

  • this = t 没有意义,也许你的意思是*this = *t
  • 还有一个一般提示:停止使用指针。除了多态之外,C++ 中很少需要指针。
  • thisTest * const,因此无法分配给。这样做(如果允许的话)将有效地允许对象更改其在内存中的地址。您的意思可能是*this = *t 或(更明确地)this-&gt;x = t-&gt;x
  • @Peter,请在答案部分回答。
  • @Someprogrammerdude 即使使用多态性,通常也可以使用引用而不是指针。在您希望能够重新绑定引用的各种情况下,指针仍然很有用,但即便如此,智能指针而不是原始指针通常也是正确的选择。

标签: c++ oop pointers this


【解决方案1】:

您不能将指针分配给this 指针,因为它是一个prvalue

this指针是一个常量指针,保存着当前对象的内存地址。 因此,this 在您的情况下属于 const Test* 类型,因此无法分配给它。这样做(如果允许的话)将有效地允许对象更改其在内存中的地址,正如@Peter 提到的那样。

注意:const Test* 是一个指向常量对象的指针。它指向的对象是常量,而不是指针本身。

PS:this-&gt;x = t-&gt;x; 大概就是你想说的吧。

【讨论】:

  • @Bathsheba 我妈妈是老师,不是牛津教授!如果你说简洁,我会理解 :) 也许我应该回滚?我喜欢简洁的答案。
  • 哦,这越来越好了。小心添加;非正式地const Test *.?
  • 可以分配一个const Test *。你只是不能修改它指向的Testinstance。所以这不是一个好的答案,我看不出你有这么多赞成。
  • @SidS 解释了这一点,抱歉。现在答案改进了,谢谢!
  • @gsamaras,您的回答仍然没有任何意义,但赞成票不断涌入。您是如何做到的?
【解决方案2】:

在这里,您正在为特定对象的“this”指针分配一个指针(此处为 t)。 “this”指针是常量。保存当前对象内存地址的指针。您根本无法更改对象的 this 指针,因为这样做实际上会更改对象在内存中的位置,并保持名称不变。

参考 - ‘this’ pointer in C++

【讨论】:

    【解决方案3】:
    #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; 
     } 
    

    【讨论】:

    • 与其只是发布一个代码 sn-p,不如添加一些与原始代码相比的错误/更改的描述并解释它。像这样,无需将 sn-p 与原始代码逐行​​比较,甚至发生了什么变化都不清楚。
    • @Saumya Verma 我不明白你想说什么。
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2021-10-04
    • 1970-01-01
    • 2016-08-03
    • 2021-10-18
    • 2021-08-23
    相关资源
    最近更新 更多