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.
}