【发布时间】:2019-09-27 12:59:43
【问题描述】:
我想将一个类实现分成三个部分,以避免用户需要处理实现细节,例如,我用来实现功能的库:
impl.cpp
#include <api.h>
#include <impl.h>
Class::Class() {
init();
}
Class::init() {
myData = SomeLibrary::Type(42);
}
Class::doSomething() {
myData.doSomething();
}
impl.h
#include <somelibrary.h>
class Class {
public:
Class();
init();
doSomething();
private:
SomeLibary::Type myData;
}
api.h
class Class {
Class();
doSomething();
}
问题是,我不允许为类定义重新定义标题。当我仅在 api.h 中定义 Class() 和 doSomething() 时,这也不起作用。
一个可能的选择是定义api.h,并且根本不在项目中使用它,而是安装它(并且不要安装impl.h)。
明显的缺点是,我需要确保api.h 和impl.h 中的常用方法始终具有相同的签名,否则使用该库的程序会出现链接器错误,我在编译时无法预测图书馆。
但是这种方法是否可行,或者我会遇到其他问题(例如,指向类成员的错误指针或类似问题),因为 obj 文件与标头不匹配?
【问题讨论】:
-
c++20 的未来 Module 可能有助于限制阐述。
标签: c++ include api-design