有没有办法让两个具有不同访问权限的 getter 并在 for 循环中使用其中一个?
Is there a way to have two getters with different accesses and use in for loop one of them?
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) 客户端方法和 (2) Foo class 的朋友方法。
但是编译器正在尝试使用 (2) 在 for 语句中受保护的方法并且发生错误 (3):
std::__cxx11::list<int*>& Foo::numbs()’ is protected within this context
我找到了一些解决方案:
- 正在更改 (2) 方法的名称(例如更改为 numbs_)。
- 将 (2) 方法的访问 class 更改为 public(我对此不满意)。
有谁知道更好的主意吗?
方法 1 不是 更好的匹配,因为 foo
不是常量对象。仅当您的对象是常量时才会调用它。
如果您的调用者选择将对象标记为 const
,只有这样错误才会消失。例如,这将按预期工作:
const Foo foo;
for (const auto& e : foo.numbs()) { // (3)
// some work...
}
看来像这样设计它是个坏主意。
附带说明一下,您还需要知道 C++ 中的可见性和可访问性是不同的东西。两种方法都是可见的,但只有一种是可访问的。并且在类型或派生类型之外无法访问更好匹配的那个。因此错误。
P.S.: 如评论中所述,const_cast<>
也将达到相同的效果。
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) 客户端方法和 (2) Foo class 的朋友方法。 但是编译器正在尝试使用 (2) 在 for 语句中受保护的方法并且发生错误 (3):
std::__cxx11::list<int*>& Foo::numbs()’ is protected within this context
我找到了一些解决方案:
- 正在更改 (2) 方法的名称(例如更改为 numbs_)。
- 将 (2) 方法的访问 class 更改为 public(我对此不满意)。
有谁知道更好的主意吗?
方法 1 不是 更好的匹配,因为 foo
不是常量对象。仅当您的对象是常量时才会调用它。
如果您的调用者选择将对象标记为 const
,只有这样错误才会消失。例如,这将按预期工作:
const Foo foo;
for (const auto& e : foo.numbs()) { // (3)
// some work...
}
看来像这样设计它是个坏主意。
附带说明一下,您还需要知道 C++ 中的可见性和可访问性是不同的东西。两种方法都是可见的,但只有一种是可访问的。并且在类型或派生类型之外无法访问更好匹配的那个。因此错误。
P.S.: 如评论中所述,const_cast<>
也将达到相同的效果。