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

问题描述

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类的朋友使用(2)方法。 但是,编译器尝试使用for语句中受保护的(2)方法,并且发生错误(3):

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

我找到了一些解决方案:

  1. 更改(2)方法名称(例如,变为numbs _)。
  2. 将(2)方法的访问类更改为公共(对此我不满意)。

有人知道更好的主意吗?

解决方法

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

如果您的呼叫者选择将对象标记为const,则错误将消失。例如,这将按预期工作:

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

像这样的imo设计它似乎是一个坏主意。

另一方面,您还需要知道C ++的可见性和可访问性是不同的。两种方法都是可见的,但是只有一种可以访问。而且,在类型或派生类型之外无法访问更匹配的一个。因此是错误。

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