我了解 Strategy 和 Abstract Factory 设计模式 - 但是它们不能解决我当前的问题:

我正在创建一个 C++ 库,它提供了一个非常基本的 GUI。但是我希望用户能够在编译时选择使用哪个 GUI 库(比如 Qt 或 FLTK)来实际呈现 GUI。然而,用户应该只需要了解我的库中的方法。

应该可以使用 Qt 后端或 FLTK 后端编译相同的代码而无需任何更改。

我想到了这样的事情:

class A
{
  // do things that are not specific to QT or FLTK here as there are many
  // methods I will need independent of the backend
}

class QT_A : public A
{
  // Implement the actual creation of a window, display of a widget here using Qt
}

class FLTK_A : public A
{
  // Implement the actual creation of a window, display of a widget here using FLTK
}

问题是我不想让用户知道 QT_AFLTK_A 。用户(开发人员)应该只处理 A 。另外,我不能同时拥有这两种变体,因为我不希望我的库同时依赖 Qt 和 FLTK;只是在编译时选择的那个。

最佳答案

一种选择是另一个答案中描述的 Pimpl 成语。

另一种选择是工厂返回指向接口(interface)类的指针:

std::unique_ptr<A> make_A()
{
#if defined(USING_QT)
    return std::unique_ptr<A>(new QT_A(...));
#elif defined(USING_FLTK)
    return std::unique_ptr<A>(new FLTK_A(...));
#else
    #error "No GUI library chosen"
#endif
}

关于c++ - 在单个接口(interface)后面隐藏多个实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14486080/

10-11 18:19