在私有嵌套类上使用 using 指令
Use the using directive on a private nested class
我已经开发了一个库一段时间了,现在我认为它已经准备好了,我正在尝试遵循 pimpl 原则以隐藏实现细节。
// File Class.h
class Class {
public:
Class();
private:
class ClassImpl;
ClassImpl* rep;
};
// File Class.cpp
#include "Class.h"
#include "ClassImpl.h"
Class::Class() {
rep = new ClassImpl();
}
实现类在另一个文件中定义如下
// File ClassImpl.h
#include "Class.h"
class Class::ClassImpl {
public:
ClassImpl();
};
及其实现:
// File ClassImpl.cpp
#include "ClassImpl.h"
#include <iostream>
using C = Class::ClassImpl; // error: 'class Class::ClassImpl' is private
C::ClassImpl() {
std::cout << "Implementation constructor";
}
主要功能:
// File main.cpp
#include "Class.h"
int main() {
Class c;
return 0;
}
这样做,编译器在ClassImpl.cpp
中的使用行上说error: 'class Class::ClassImpl' is private
。如果我删除它并改用Class::ClassImpl
,一切正常。
有没有办法在私有嵌套类ClassImpl
上使用using
?
有没有办法在私有嵌套类
ClassImpl
上使用using
?
简短的回答是"不"。
接下来是更长的答案。
您要做的是一个using
声明,而不是一个using
指令。
您的使用声明
using C = Class::ClassImpl;
位于文件范围内,因此名称Class::ClassImpl
不能直接用作该范围内的名称。
标准的第一个相关部分(C++17)是第10.3.3节"using
声明",其中第19段指出">由使用声明创建的同义词具有成员声明通常的可访问性"。
要了解"通常可访问性"的含义,请参阅第 14 节"成员访问控制",其中指出"private
名称只能由声明它的班级的成员和朋友使用"。 这里"名称"的用法非常具体 - 任何具有与类private
的名称(成员声明、类型声明等)都以相同的方式处理。
如果您想在文件范围内有一个using
声明,如您的示例所示;
using C = Class::ClassImpl;
那么ClassImpl
需要是Class
的public
名称(嵌套类的)。 无法在文件范围内访问类的private
和protected
名称。
没有办法在私有嵌套类 ClassImpl 上使用?
是的。在Class
中声明具有公共访问权限的ClassImpl
:
class Class {
public:
Class();
class ClassImpl;
private:
ClassImpl* rep; // should be reference, see note.
};
// ...
using C = Class::ClassImpl;
现场演示
您还可以ClassImpl
不是嵌套类。
注意:您可能希望Class::rep
作为引用而不是(裸)指针。有效的Class
实例没有理由没有实现对象(空指针)。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 在C++头文件中放置 using 指令的位置
- 为什么 using 指令不能与普通函数"associate"?
- 为什么名称查找在找到使用 using 指令隐式声明的实体时不停止?
- 在私有嵌套类上使用 using 指令
- "using"指令如何使用模板成员函数
- 在本地将 'using std::foo' 指令应用于构造函数初始值设定项列表 (C++)
- 为什么无法使用'using'指令实现继承的纯虚拟方法?
- c++using指令的作用域
- 为什么 C++11 中仍然需要 "using" 指令来从派生类中重载的基类中引入方法
- 类内的"Using"指令
- 通过 using-指令调用开始和结束
- visual using指令如何影响C++中的函数参数
- 为什么 C# 中接受"using namespace"指令编码实践?
- #include 指令和"using"语句的顺序在C++头文件的开头是否重要?
- 通过 using-指令在 using-声明中进行名称查找
- 在最近的封闭范围内使用using指令声明局部外部变量
- 通过using指令将私有继承的内部模板公开