我已经建立了一个像这样的图书馆:
lib/
private_class_impl.cc
private_class_decl.h
public_class_impl.cc
include/mylib/
public_class_decl.h
我的公共类需要有一个指向私有类的私有指针。
在没有将private_class_decl.h
移至public_class_decl.h
的情况下,有没有办法将private_class_decl.h
公开给我的include/mylb/
声明?
答案 0 :(得分:1)
您可以在公共标头中转发声明私有类(它不会公开其接口或公共成员)。
struct private_class;
class public_class {
private_class *m_private;
/* ... */
};
#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'
答案 1 :(得分:1)
您可以像pImpl idiom
一样转发声明私有类