内部/外部标头分离

时间:2016-07-28 13:40:34

标签: c++

我已经建立了一个像这样的图书馆:

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/声明?

2 个答案:

答案 0 :(得分:1)

您可以在公共标头中转发声明私有类(它不会公开其接口或公共成员)。

在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'

答案 1 :(得分:1)

您可以像pImpl idiom

一样转发声明私有类