【发布时间】:2019-05-29 01:14:33
【问题描述】:
我一直在开发一个库,现在我认为它已经准备好了,我正在尝试关注 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,一切正常。
有没有办法在私有嵌套类ClassImpl 上使用using?
【问题讨论】:
-
您引用的页面末尾的示例是否与您做同样的事情?他们是否也尝试在
main()函数中使用using和widget类的impl?没有。 -
@JoeyMallone 否,因为它们在类声明中定义了函数。在示例页面中这似乎是一个好主意,但因为我的实现是一百行长,所以它对我来说还不够
-
试试这个
ClassImpl::ClassImpl() {作为构造函数,留下using。 -
我没有什么可以支持这一说法(因此仅作为评论),但不,这是不可能的。您正在尝试创建一个alias。想象一下,如果您可以为任何私有符号创建别名。那会破坏访问修饰符的全部目的,不是吗?无论如何,虽然我讨厌预编译器,但您可以通过简单地定义一个常量来实现相同的代码缩减:
#define C Class::ClassImpl
标签: c++ class-visibility