0

サポートしたい OS ごとに 1 つずつ、3 つのウィンドウ クラスがあるとします。

  • Windowsウィンドウ
  • OSXウィンドウ
  • Linuxウィンドウ

それらはすべてWindowクラスから継承します。これは、インスタンス化するクラスでもあります。Window クラスには . -> および :: 演算子がオーバーロードされ、(IFDEF に基づいて) 実行されている OS に応じて、this ポインターが関連するクラスにキャストされます。

私がやりたいことは、どの OS が実行されているかについての手がかりなしに 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 に答える