c++ - 在私有(private)嵌套类上使用 using 指令

标签 c++ class-visibility

我开发一个库已经有一段时间了,现在我认为它已经准备好了,我正在尝试遵循 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 class ClassImpl?

简短的回答是“不”。

下面是更长的答案。

您要做的是 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 需要是 Classpublic 名称(嵌套类的)。无法在文件范围内访问类的 privateprotected 名称。

关于c++ - 在私有(private)嵌套类上使用 using 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54005503/

相关文章:

c++ - Visual C++ - 内存泄漏检测

c++ - 如何在不使用全局变量的情况下在函数之间使用多个变量?

java - 默认情况下,Java 和 C++ 中的类是私有(private)的还是公有的?

c++ - 为什么我的赋值运算符没有被调用?

c++ - Qt按钮按下增量

c++ - 新文件系统库和 clang++7 的 undefined reference 错误

C++,如何将派生类转换为 protected 基类?

java - 使用私有(private)成员参数化通用类型

java - Swift 和可见性声明

.net - 如何使用 Mono.Cecil 更改类型的访问器