class Foo {
protected:
QPoint& bar() const;
private:
QPoint m_bar;
};
QPoint& Foo::bar() const {
return m_bar;
}
我遇到了这个错误:
错误:从类型为“const QPoint”的表达式对类型为“QPoint&”的引用的初始化无效
但是,如果我将其更改为这样,它会起作用:
QPoint& Foo::bar() const {
return (QPoint&) m_bar;
}
1) 我不明白为什么编译器说我的 QPoint 是常量。
2) 把 Actor 留在那里可以吗?
最佳答案
在 Foo
类的非常量成员函数中,this
指针的类型为 Foo* const
- 即,指针是常量,但不是它指向的实例。然而,在 const 成员函数中,this
指针的类型为 const Foo* const
。这意味着它指向的对象也是常量。
因此,在您的示例中,当您使用 this->m_bar
(其中 m_bar
只是缩写形式)时,则 m_bar
是常量对象的成员——这就是为什么不能将其作为非常量引用返回的原因。
从设计 POV 来看这实际上是有意义的:如果 Foo
对象是一个常量对象,并且您可以为常量对象调用 Foo::bar
,那么,如果这将返回对某些您可以摆弄的内部结构的非常量引用,您将能够更改常量对象的状态。
现在您必须审视您的设计并问问自己您是如何到达这一点的以及您的实际意图是什么。如果该 m_bar
成员实际上不是对象状态的一部分(例如,它仅用于调试目的),那么您可以考虑将其设置为可变
。如果它是对象状态的一部分,那么你就得问问自己,为什么要返回一个常量对象的一些内部数据的非常量引用。要么使成员函数成为非 const,要么返回 const 引用,要么重载成员函数:
class Foo {
public:
const QPoint& bar() const {return m_bar;}
QPoint& bar() {return m_bar;}
// ...
};
关于c++ - 如何正确返回对类成员的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815643/