4

我正在开发一个由许多独立子系统组成的系统。其中两个子系统是 Window 和 GraphicsAdapter 子系统。

GraphicsAdapter 需要一个低级窗口句柄(HWND 或 X11 窗口句柄,取决于操作系统),而 Window 子系统是一种抽象这些操作系统特定 API 的方法。

如果 Window 子系统允许访问低级 API 句柄,则封装被破坏的可能性很大。

如果它允许窗口全屏并返回,但必须触发事件警告系统有关这些更改,并且低级句柄被用于在其不知情的情况下切换到全屏怎么办?

如何确保句柄安全地从 Window 子系统传送到 GraphicsAdapter 而不会被滥用,并且仍然足够灵活以允许稍后添加其他子系统(如 GraphicsAdapter),同时保持类型安全?

有没有办法以 Direct3D 和 OpenGL 可以从句柄访问刚好足以正常工作的方式封装句柄?

- 编辑

除了安全地将把手从一个子系统转移到另一个子系统之外,例如,知道子系统可以由不同的编码人员团队编写,是否有任何方法可以提醒他们使用把手的方式?

注释是显而易见的选择,但编译器强制执行的东西才是我真正想要的......

4

3 回答 3

6

HWND 和 X11 窗口句柄都是指针类型。你可以利用它来发挥你的优势。做这样的事情:

struct WindowHandleImpl;
typedef WindowHandleImpl *WindowHandle;

C++ 允许您很好地使用指向不完整类型的指针 - 只是不定义WindowHandleImpl任何地方的内容,并且WindowHandle是一种完全不透明的类型,可以由应用程序传递而无需披露任何实现细节。

因为HWND, X11WindowWindowHandle都是指针类型,你可以在它们之间自由无损地转换。因此,每当您需要将包装的窗口句柄返回给应用程序时,您都会执行 a ,当您需要将应用程序指定的转换为实际的平台类型static_cast<WindowHandle>(some_hwnd)时,相同的技巧会反过来工作。WindowHandle

如果你需要移植到一个不使用指针类型来表示窗口句柄的平台,你可以将它包装在一个结构/类中并返回一个指向它的指针。

于 2010-11-02T08:54:27.400 回答
2

通过虚函数暴露句柄上的操作:

class GenericHandle
{
    public:
        virtual void some_operation() = 0;
};

// Windows API
class WindowsHandle : public GenericHandle
{
    public:
        virtual void some_operation()
        {
            WndOperation (handle_);
        }
    private:
        HANDLE* handle_;
};

// Some X system API
class XHandle : public GenericHandle
{
    public:
        virtual void some_operation()
        {
           XOperation (handle_);
        }
    private:
        XVOID* handle_;
};

一种可能的配置方法GraphicsAdapter

GraphicsAdapter* ga = new GraphicsAdapter(GenericHandleFactory::get_handle(SYSTEM_ID));
于 2010-11-02T08:25:03.923 回答
-1

记录您期望使用它的方式。

相信团队中的其他编码员。

不要编写一堆代码,试图让您的团队只按照您希望的方式进行编码。更多的代码意味着更多的代码需要维护,更多的错误机会,让下一个看到这段代码的人更加困惑,想知道它到底在做什么。

于 2010-11-05T03:55:19.080 回答