【问题标题】:C++ returning pointers value not changeableC ++返回指针值不可更改
【发布时间】:2013-08-23 00:16:50
【问题描述】:

我遇到了一个奇怪的问题。当我尝试编写一个返回指向子类的指针的函数时,我将其交换为该子类的不同实例,我得到“错误 C2106:'=':左操作数必须是左值”错误。

问题出在one->getMe() = two; 行:

class subClass{};

class someClass{

public:

subClass * pointer;

someClass(){
    pointer = new subClass;
}

subClass * getMe(){
    return pointer;
}

};

int main(){

someClass * one = new someClass;
subClass * two = new subClass;

one->getMe() = two; 
}

我对 c++ 有点陌生,所以问题可能非常简单。非常感谢任何帮助。

【问题讨论】:

  • 你要修改什么-pointer的值还是pointer指向的对象的值?
  • 名称getMe() 表明它可以获取一个值,而不是设置该值
  • 您正在返回一个右值。使用 set 方法设置新指针。
  • 指针指向的对象,与其他元素交换。
  • 您使用函数而不是简单地使用可公开访问的成员变量是否有原因?即one->pointer = two

标签: c++


【解决方案1】:

从函数返回的指针是对象中指针的副本。它是临时的,你不能分配给它。即使您可以分配给它,它也没有用,因为它不再连接到对象中的指针。如果希望在从函数返回对象的指针后能够赋值给它,则希望通过引用返回指针。

subClass *& getMe() {
    return pointer;
}

您还应该考虑添加一个 const 重载来处理 const 对象。它可能看起来像这样:

subclass * const & getme() const {
    return pointer;
}

【讨论】:

  • 很遗憾,考虑到 const 正确性的唯一答案最终被最少投票。 +1
【解决方案2】:

线

one->getMe() = two;

正在尝试将 2 处的指针分配给 1->getMe()。但是 one->getMe() 返回一个您无法分配的临时副本。如果您想通过引用返回指针并因此能够更改它,那么您可以使用签名

subClass *& getMe();

正如其他人所建议的那样。

话虽如此,您正在向所有人公开类的内部工作,并且可以查看和修改,特别是指向堆上可能会或可能不会正确释放的对象的指针,这是不明智的。

【讨论】:

  • 感谢您的快速响应,解决了问题。我在实际项目中使用它在一个更安全的环境中。
猜你喜欢
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2021-08-22
  • 2018-05-30
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多