0

假设我有三个窗口类,一个用于我想要支持的每个操作系统:

  • 窗口窗口
  • OSX窗口
  • Linux窗口

它们都继承自Window类。这也是您实例化的类。Window 类具有 . -> 和 :: 运算符重载,并且根据运行的操作系统(基于 IFDEF),它会将 this 指针转换为相关类。

我想要做的只是创建一个 Window 实例,而不知道正在运行什么操作系统。这种想法是不是很错误?沮丧是危险的吗?有没有更好的方法来做到这一点?

我知道有图书馆可以做到这一点,但我想自己尝试一下。

我想最简单的方法是创建一个工厂。但是这样的事情可以做到吗?

4

2 回答 2

3

您根本不能重载范围解析运算符 :: 。您可以重载 -> 运算符,但是当您调用该运算符时,您已经必须拥有一个必需类型的对象。要创建您的窗口,只需使用一个简单的工厂方法:

class Window
{
public:
    static Window *CreateWindow(...)
    {
#ifdef _WIN32
        return new Win32Window(...);
#elif defined(/** whatever is defined for Linux */)
        return new X11Window(...);
#elif defined(/** whatever is defined for Mac */)
        return new CocoaWindow(...);
#else
#error "Bad platform!"
#endif
    }
};
于 2009-02-07T15:08:43.737 回答
1

您可能应该做的是有一个工厂方法,并使用 PIMPL 成语。您的工厂创建了 2 个类 - 一个 Window 类和一个 WindowImpl 类。Window 类只是将方法调用转发给 WindowImpl 类。客户端代码向工厂询问窗口,工厂知道(基于配置、平台检查等)要使用哪个实现类。

于 2009-02-07T15:05:52.447 回答