C ++返回指针值不可更改
Posted
技术标签:
【中文标题】C ++返回指针值不可更改【英文标题】:C++ returning pointers value not changeable 【发布时间】: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
【参考方案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();
正如其他人所建议的那样。
话虽如此,您正在向所有人公开类的内部工作,并且可以查看和修改,特别是指向堆上可能会或可能不会正确释放的对象的指针,这是不明智的。
【讨论】:
感谢您的快速响应,解决了问题。我在实际项目中使用它在一个更安全的环境中。以上是关于C ++返回指针值不可更改的主要内容,如果未能解决你的问题,请参考以下文章