4

多くの独立したサブシステムで構成されるシステムを開発しています。そのようなサブシステムの 2 つは、Window サブシステムと GraphicsAdapter サブシステムです。

GraphicsAdapter には低レベルのウィンドウ ハンドル (オペレーティング システムに応じて HWND または X11 ウィンドウ ハンドル) が必要であり、ウィンドウ サブシステムはこれらの OS 固有の API を抽象化する方法です。

Window サブシステムが低レベル API ハンドルへのアクセスを許可した場合、カプセル化が破られる可能性が高くなります。

ウィンドウをフルスクリーンに切り替えたり元に戻したりできるが、それらの変更についてシステムに警告するイベントを発生させる必要があり、低レベルのハンドルを使用して知らないうちにフルスクリーンに切り替えるとしたら?

ハンドルが悪用されることなく Window サブシステムから GraphicsAdapter に安全に運ばれ、GraphicsAdapter のような他のサブシステムを後で追加できるように十分な柔軟性を確保しながら、同時に型の安全性を維持するにはどうすればよいでしょうか?

Direct3D と OpenGL がハンドルから適切に動作するのに十分なだけアクセスできる方法でハンドルをカプセル化する方法はありますか?

- 編集

さらに、あるサブシステムから別のサブシステムにハンドルを安全に運ぶために、たとえば、サブシステムは別のコーダー チームによって記述される可能性があることを知っている場合、ハンドルの使用方法を彼らに思い出させる方法はありますか?

コメントは当然の選択ですが、コンパイラによって強制されるものは、私が本当に探しているものです...

4

3 に答える 3

6

HWND と X11 ウィンドウ ハンドルはどちらもポインター型です。これを有利に利用できます。次のようにします。

struct WindowHandleImpl;
typedef WindowHandleImpl *WindowHandle;

C++ では、不完全な型へのポインターを問題なく操作できます。ただし、WindowHandleImplどこにもコンテンツを定義しないWindowHandleでください。完全に不透明な型であり、実装の詳細を開示することなくアプリで渡すことができます。

HWND、 X11 Window、およびはすべてポインター型であるため、WindowHandleそれらの間で自由かつロスレスにキャストできます。したがって、ラップされたウィンドウ ハンドルをアプリに返す必要があるときはいつでも を実行し、アプリで指定されたものを実際のプラットフォーム タイプstatic_cast<WindowHandle>(some_hwnd)に変換する必要がある場合は、同じトリックが逆に機能します。WindowHandle

Window ハンドルを示すためにポインター型を使用しないプラットフォームに移植する必要がある場合は、それを struct / class でラップし、それへのポインターを返すことができます。

于 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 に答える