【问题标题】:Overloading . -> and :: for use in multiplatform classes重载。 -> 和 :: 用于多平台类
【发布时间】:2009-02-07 15:00:47
【问题描述】:

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

  • Windows 窗口
  • OSXWindow
  • Linux 窗口

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

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

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

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

【问题讨论】:

    标签: c++ operator-overloading multiplatform


    【解决方案1】:

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

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

    【讨论】:

    • 结合私有构造函数的静态工厂函数;我最好的选择?
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2013-01-24
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多