我构建了一个布局如下的库:
lib/
private_class_impl.cc
private_class_decl.h
public_class_impl.cc
include/mylib/
public_class_decl.h
我的公共(public)类需要有一个指向私有(private)类的私有(private)指针。
有什么方法可以在不将 private_class_decl.h
移动到 include 的情况下将
?private_class_decl.h
公开到我的 public_class_decl.h
声明/mylb/
最佳答案
您可以在公共(public) header 中转发声明私有(private)类(它不会暴露其接口(interface)或公共(public)成员)。
在 public_class_decl.h 中
struct private_class;
class public_class {
private_class *m_private;
/* ... */
};
在 public_class_impl.cpp 中
#include "public_class_decl.h"
#include "private_class_decl.h"
public_class::foo() {
// private_class interface is known since we can include
// "private_class_decl.h" here...
m_private->method_of_private_class();
}
这个技巧之所以有效,是因为 public_class
使用了一个指向 private_class
的指针,即使我们只提供了前向声明,它也是一个完整的类型。您不能像下面这样按值使用 private_class
:
struct private_class;
class public_class {
private_class m_private;
/* ... */
};
这会导致错误:error: field 'm_member' has incomplete type 'private_class'
关于c++ - 内部/外部标题分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38638197/