c++ - 有没有办法让两个具有不同访问权限的吸气剂并在其中一个循环中使用?
问题描述
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
我找到了一些解决方案:
- 更改 (2) 方法的名称(例如更改为 numbs_)。
- 将(2)方法的访问类更改为公共(我对此不满意)。
有谁知道更好的主意吗?
解决方案
方法 1不是更好的匹配,因为foo
它不是一个常量对象。只有当您的对象是常量时才会调用它。
如果您的调用者选择将对象标记为const
,那么只有这样错误才会消失。例如,这将按预期工作:
const Foo foo;
for (const auto& e : foo.numbs()) { // (3)
// some work...
}
像这样设计它似乎是个坏主意。
附带说明一下,您还需要知道 C++ 中的可见性和可访问性是不同的东西。这两种方法都是可见的,但只有一种是可访问的。在类型或派生类型之外无法访问更好匹配的那个。因此错误。
PS:正如评论中所指出的, aconst_cast<>
也将达到相同的效果。
推荐阅读
- php - 在 laravel 5.4 中为经过身份验证的用户创建全局变量
- python - 使用 DataFrame.plot 在堆积条形图中显示总数和百分比
- google-analytics-api - 字段“直接会话”即时接口 - 不在 Api 中?
- javascript - TypeError:无法设置未定义的属性“data_id”
- java - 更改最终对象的属性属性对象
- terraform - terraform:如何使资源具有幂等性-即,如果不存在则创建,但如果存在则不执行任何操作
- python - 多行三引号原始字符串正则表达式不起作用
- javascript - 如何在循环中使用正则表达式替换来更改文本
- c++ - 模板和显式特化
- kentico - Kentico 使用 API 将文件上传到页面类型的文件字段