c++ - 如何正确返回对类成员的引用?

标签 c++

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/

相关文章:

c++ - 从 map 中删除条目显示 Valgrind 中的泄漏

c++ - 如何运行SFML模板?

c++ - 为什么 C++ 允许我们在声明变量时将变量名括在括号中?

c++ - : if (number)是什么意思

c++ - 如何获得连接路由中的跃点?

c++ - 如何使用 std::map 在 C++ 中检索 std::vector<int>?

c++ - 如何在 C++ 中创建一个基本线程

c++ - c++中的循环链表问题

c++ - 在不同变体模板类的实例之间复制

c++ - 除了使用纯虚拟之外,如何通过基类从派生类获取成员