通过减少填充标头的数量来隐藏实现细节

Hum*_*awi 7 c++ c++11

我正在开发一个库.我有从外部调用的接口类.

我还有一个不应该从外面调用的内部引擎.

当我在这里和那里阅读时,我应该隐藏内部引擎类,甚至不填充它的标题.由于我有以下结构:

interface.hpp:

#include "engine.hpp" 
class interface{
private:
    enigne eng;
};
Run Code Online (Sandbox Code Playgroud)

interface.cpp:

#include "engine.hpp"
//code that uses member variables and functions from eninge 
Run Code Online (Sandbox Code Playgroud)

engine.hpp:

class engine{};
Run Code Online (Sandbox Code Playgroud)

要解决填充"engine.hpp"的问题,我应该将代码更改为:

interface.hpp:

class engine;
class interface{
private:
    some_smart_pointer<enigne> eng_ptr;
};
Run Code Online (Sandbox Code Playgroud)

interface.cpp:

#include "engine.hpp"
//code that uses member variables and functions from eninge 
Run Code Online (Sandbox Code Playgroud)

enigne.hpp:

class engine{};
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.但是,从现在开始engine动态分配.它的所有成员变量都在免费商店中.

我无法理解我必须改变我的设计并在免费商店上分配引擎来解决隐藏实现细节的问题.有更好的解决方案吗?

PS我不是在问这个解决方案为何有效.我知道如果我把它留在堆栈上,知道引擎类的大小是强制性的.我的问题是要求一个可以解决问题的不同设计.

编辑:

双方interfaceengine有成员变量.

Fra*_*fer 2

这是此问题的标准解决方案:它被命名为 PIMPL(指向实现的指针)习惯用法。顾名思义,它总是涉及一个指向实现类的指针(或智能指针),因为 C++ 根本不允许这样做:

class engine;
class interface{
private:
    enigne eng;
};
Run Code Online (Sandbox Code Playgroud)