c++ - 有没有办法让两个具有不同访问权限的 getter 并在 for 循环中使用其中一个?

标签 c++ for-loop oop getter

class Foo {
    // friend Bar;

    public: const std::list<int*>& numbs () const { // (1)
        return mNumbs;
    }

    protected: std::list<int*>& numbs () { // (2)
        return mNumbs;
    }

    private: std::list<int*> mNumbs;
};

int main () {
    Foo foo;
    for (const auto& e : foo.numbs()) { // (3)
        // some work...
    }
}

我的意图是强制对客户端使用(1)方法,对 Foo 类的 friend 使用(2)方法。 但是编译器尝试使用 for 语句中 protected (2) 方法,并且发生错误 (3):

std::__cxx11::list<int*>& Foo::numbs()’ is protected within this context

我找到了一些解决方案:

  1. 更改 (2) 方法的名称(例如更改为 numbs_)。
  2. 将 (2) 方法的访问类别更改为 public(我对此不满意)。

有人知道更好的主意吗?

最佳答案

方法 1 不是更好的匹配,因为 foo不是一个常量对象。仅当您的对象是常量时才会调用它。

如果您的调用者选择将该对象标记为 const ,只有这样错误才会消失。例如,这将按预期工作:

const Foo foo;
for (const auto& e : foo.numbs()) { // (3)
    // some work...
}

在我看来,这样设计似乎是个坏主意。

顺便说一句,您还需要知道 C++ 中的可见性和可访问性是不同的东西。两种方法都是可见的,但只有一种可以访问。并且更匹配的类型在类型或派生类型之外无法访问。因此出现错误。

P.S.:如评论中所述,const_cast<>也会达到同样的效果。

关于c++ - 有没有办法让两个具有不同访问权限的 getter 并在 for 循环中使用其中一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64214283/

相关文章:

javascript - 如何使用 Javascript for 循环显示它使用实时计数循环的次数?

javascript - 更改数组中特定元素的字体颜色 - Javascript

c++ - 无法覆盖继承的静态常量成员

Java:按钮封装

c++ - 使用 boost::serialize 反序列化多个值(使用 SSCCE)

c++ - Dev-C++ IDE 中的自动格式化功能

objective-c - 浏览对象的字段

c++ - 在 B 类中初始化 A 类(带有引用成员)

c++ - 分布式锁

c++ - 使用 vector 的数组下标的无效类型 'int[int]'