2013-08-23 82 views
0

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

里边反问题是在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++这样的问题可能是可怕的简单。任何帮助深表感谢。

+0

你想修改什么 - 指针的值或指针指向的对象的值? –

+0

名称'getMe()'表明它可以_get_值,而不是_set_值 – sehe

+0

您正在返回一个右值。使用set方法设置新的指针。 – Banex

回答

1

线

one->getMe() = two; 

试图指针在两个分配给单> getMe()。但是one-> getMe()返回一个你不能分配的临时副本。如果你想通过参考返回指针,从而能够改变它,那么你可以使用签名

subClass *& getMe(); 

其他人已经建议。这就是说,你正在暴露一个类的内部工作,以便所有人和各种各样的人查看和修改,特别是指向堆上的对象的指针,这些指针可能会或可能不会被正确地解除分配,这是不明智的。

+0

感谢您的快速响应,解决了问题。我正在真实项目的更安全的环境中使用它。 –

5

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

subClass *& getMe() { 
    return pointer; 
} 

您还应该考虑添加一个const重载以处理const对象。这可能是这样的:

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

我建议在这里const常数超载 – sehe

+0

神奇的解释,谢谢。 –

+0

令人悲伤的是,考虑const正确性的唯一答案最终被投票次数最少。 +1 – sehe