C++ 将公共接口与实现细节分离

C++ 将公共接口与实现细节分离,c++,C++,我必须设计一个Font类,该类将具有跨平台或不同库的多个实现(例如Win32 GDI或FreeType)。因此,基本上将有单个共享头/接口文件和多个.cpp实现(在构建时选择)。我更愿意保持公共接口(头文件)不受任何实现细节的影响,但这通常很难实现。字体对象必须拖动某种私有状态,比如GDI中的句柄,或者内部的FreeType face对象 在C++中,跟踪私有实现细节的最佳方法是什么?我应该在实现文件中使用静态数据吗 编辑:找到了这篇关于以下主题的精彩文章: p、 我记得在Objective-C

我必须设计一个
Font
类,该类将具有跨平台或不同库的多个实现(例如Win32 GDI或FreeType)。因此,基本上将有单个共享头/接口文件和多个.cpp实现(在构建时选择)。我更愿意保持公共接口(头文件)不受任何实现细节的影响,但这通常很难实现。字体对象必须拖动某种私有状态,比如GDI中的句柄,或者内部的FreeType face对象

C++中,跟踪私有实现细节的最佳方法是什么?我应该在实现文件中使用静态数据吗

编辑:找到了这篇关于以下主题的精彩文章:


p、 我记得在Objective-C中,有一些私有类别允许您在私有实现文件中定义类扩展,这是一个非常优雅的解决方案。

您可以使用PIMPL设计模式

这基本上就是对象持有指向实际平台相关部分的指针,并将所有平台相关调用传递给该对象的地方

字体.h Font.cpp
pimpl最大的优点是实现类可以是多态的(这在设计模式iirc中有一个名称)。所以,实际上,您可以使用工厂,如果需要,您还可以在运行时选择实现(以适应操作系统变体)。
class FontPlatform;
class Font
{
   public:
       Font();
       void Stuff();
       void StuffPlatform();
   private:
       FontPlatform*  plat;
};
#include "Font.h"
#if Win
#include "FontWindows.h"
#else
#error "Not implemented on non Win platforms"
#endif

Font::Font()
  : plat(new PLATFORM_SPCIFIC_FONT)  // DO this cleaner by using factory.
{}

void Font::Stuff()  { /* DoStuff */ }
void Font::StuffPlatform()
{
    plat->doStuffPlat();  // Call the platform specific code.
}