c – 如何避免#include对外部库的依赖

如果我正在创建一个带有头文件的静态库,例如:
// Myfile.h

#include "SomeHeaderFile.h" // External library

Class MyClass
{

// My code

};

在我自己的项目中,我可以告诉编译器(在我的情况下,Visual Studio)在哪里寻找SomeHeaderFile.h.然而,我不希望我的用户关心这一点 – 他们应该能够包含我的标题,而不必通知他们的编译器SomeHeaderFile.h的位置.

这种情况如何正常处理?

解决方法

这是一个经典的“编译防火墙”场景.有两个简单的解决方案可以做:

>从外部库转发声明所需的任何类或函数.然后将外部库的头文件仅包含在您的cpp文件中(当您实际需要使用您的头文件中转发的类或函数时).
>使用您转发的PImpl成语(或Cheshire Cat),声明一个“私有”(在cpp文件中)声明和定义的“实现”类.您使用该私有类来放置所有与外部程序库相关的代码,以避免在您的公共类(在您的头文件中声明的那个)中有任何痕迹.

以下是使用第一个选项的示例:

#ifndef MY_LIB_MY_HEADER_H
#define MY_LIB_MY_HEADER_H

class some_external_class;  // forward-declare external dependency.

class my_class {
  public:
    // ...
    void someFunction(some_external_class& aRef);  // declare members using the forward-declared incomplete type.
};

#endif

// in the cpp file:

#include "my_header.h"
#include "some_external_header.h"

void my_class::someFunction(some_external_class& aRef) {
  // here,you can use all that you want from some_external_class.
};

以下是选项2的示例:

#ifndef MY_LIB_MY_HEADER_H
#define MY_LIB_MY_HEADER_H

class my_class_impl;  // forward-declare private "implementation" class.

class my_class {
  private:
    std::unique_ptr<my_class_impl> pimpl; // a vanishing facade...
  public:
    // ...
};

#endif

// in the cpp file:

#include "my_header.h"
#include "some_external_header.h"

class my_class_impl {
  private:
    some_external_class obj;
    // ...
  public:
    // some functions ... 
};

my_class::my_class() : pimpl(new my_class_impl()) { };

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...