【问题标题】:Why can I not pass 'this' to an inner class's method in this case?在这种情况下,为什么我不能将“this”传递给内部类的方法?
【发布时间】:2021-08-08 19:23:35
【问题描述】:

我有一个包含内部类的类,看起来有点像这样:

class Foo
{
    class Bar
    {
    public:
        void update(const Foo& f)
        {
            //Updates using public getters of Foo
        }
    };
public:
    void doStuff() const
    {
        b_.update(*this);
    }
private:
    Bar b_;
};

b_.update(*this) 行当前给我错误cannot convert 'this' pointer from 'const Foo::Bar' to 'Foo::Bar &'

这是为什么呢? update 方法的参数是const Foo& 类型,这意味着它不可能修改Foo 对象,如果它愿意。那不应该满足const方法doStuff吗?

我已经尝试在谷歌上搜索遇到相同问题的人一个小时,但我似乎无法正确地用词来找到类似的问题。

我正在尝试做的事情是否可行,或者我需要改变我的设计吗?

【问题讨论】:

  • 看来doStuff方法不应该被标记为const
  • 请注意,C++ 没有“内部类”的概念。有一个具有该名称的 Java 事物,而 C++ 中没有任何东西可以做到这一点。通常Bar 被称为嵌套类。

标签: c++ inner-classes


【解决方案1】:

doStuffconst,因此 b_ 在这种情况下也是 const,因此不允许调用非常量 update 函数。

如果doStuff 需要修改b_,则不应将其标记为const,您可以将b_ 标记为mutable,但这很少是正确的做法。

【讨论】:

  • 以前从未听说过关键字mutable。将b_ 声明为mutable 确实解决了这个问题,但我知道这并不理想。标记为const 的方法永远不应修改成员。如果 b_ 成员的功能仅在 Foo 内部使用以帮助进行一些计算,您认为这种用法是否可以接受?或者我应该改变我的设计,使Bar 不是嵌套类,而是在Foo 之外声明?
  • mutable 唯一真正有效的用途是用于调用访问器方法(您希望是 const)需要能够更新缓存值的缓存,即因此值需要为mutable。如果调用一个方法不会对类进行外部可见的更改,那么将其标记为const 并在必要时拥有mutable 成员可能是合理的。 Bar 是一个嵌套类对这种行为没有影响。
猜你喜欢
  • 2014-06-03
  • 2021-04-28
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多