我开发一个库已经有一段时间了,现在我认为它已经准备好了,我正在尝试遵循 pimpl principle为了隐藏实现细节。
// 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
中的 using 行上提示 error: 'class Class::ClassImpl' is private
。如果我删除它并改用 Class::ClassImpl
,一切正常。
有没有办法在私有(private)嵌套类 ClassImpl
上使用 using
?
最佳答案
Is there a way to use
using
on the private nested classClassImpl
?
简短的回答是“不”。
下面是更长的答案。
您要做的是 using
声明,而不是 using
指令。
你的使用声明
using C = Class::ClassImpl;
在文件范围内,因此名称 Class::ClassImpl
不能直接用作该范围内的名称。
标准 (C++17) 的第一个相关部分是第 10.3.3 节“using
声明”,第 19 段指出“由 using- 创建的同义词声明 具有成员声明 的通常可访问性。
要找到“通常可访问性”的含义,请参阅第 14 节“成员访问控制”,其中指出“private
名称只能由其中的类的成员和 friend 使用它被宣布”。此处“名称”的用法非常具体 - 任何具有类的 私有(private)
名称的内容(成员声明、类型声明等)都以相同的方式处理。
如果你想在文件范围内有一个 using
声明,按照你的例子;
using C = Class::ClassImpl;
然后 ClassImpl
需要是 Class
的 public
名称(嵌套类的)。无法在文件范围内访问类的 private
和 protected
名称。
关于c++ - 在私有(private)嵌套类上使用 using 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54005503/