有没有办法让两个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(方法。然而,编译器正试图使用(2(在for语句中受保护的方法,并且发生了错误(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++中的可见性和可访问性是不同的。两个方法都可见,但只有一个可以访问。更匹配的类型在类型或派生类型之外是不可访问的。因此出现了错误。

附言:正如评论中所指出的,const_cast<>也将达到同样的效果。

相关内容

最新更新