gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:19:08 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com