c++ - 内部/外部标题分离

标签 c++

我构建了一个布局如下的库:

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/

相关文章:

c++ - 非常量左值引用的示例

c++ - 我应该如何在使用 C++ 模板创建的类之间进行转换?

c++ - 在 vcpkg 和 CMake 中使用静态 Boost 库

c++ - 模板特化中的类型(数组类型的 unique_ptr)

c++ - 为什么不允许构造函数被引用?

c++ - 在 C++11 中迭代 vector 时从 vector 中删除元素

c++ - 简单的 CArray 问题

python - 如何控制 cython cdef 类的模块/名称?

c++ - OpenCV + 实感 : Visual Studio Link 2019 error

c++ - 如何覆盖 boost::serialize 获取指向对象的指针时发生的情况