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 ++返回指针值不可更改的主要内容,如果未能解决你的问题,请参考以下文章

在 C 和 Go 中传递指针而不是返回新变量?

指针初识

c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?

函数返回多个值(c/c++)

(C/C++函数返回多个值)

c指针 --笔记2返回指针值的函数