C++ ライブラリでインターフェイスの詳細を非表示にすることについて質問があります。この問題は、次の例で説明されています。
Init、Run、Tick、Shutdown、GetXXXSubSystem などのメソッドを公開するISystemというクラスがあるとします。 X は、ISoundSystem、IInputSystemなどのさまざまなインターフェイスへのポインターです。
また、Win32System、OSXSystemなどの ISystem の具体的な実装もあります 。
これらの特定の実装は、内部を隠すために pimpl イディオムを使用します。たとえば、Win32System はWin32RawInputSystem を入力システム マネージャーとしてインスタンス化します。
このようなすべてのマネージャーには、インターフェイスの一部ではない独自のInit、Run、Tick、および Shutdownメソッド (具象実装のみ) があり、これらは具象システム実装によって実行および管理されます。
GetXXXSubSystem を呼び出すユーザーは、これらのメソッド (Init など) なしでインターフェイス ポインターを取得しますが、取得したポインターを具体的な実装にキャストし、Init Run Tick などのアクセスできないメソッドをトリガーすることができます。
問題は、どうにかして具象クラスを隠すことができるかということです。具象実装で保護されたこれらのメソッドと、最終的には友達になるタイプのクラスをテンプレートにしようとしましたが、これは禁止されているようで、既存のハックは VC11 では機能しません。
私が正しく知っていると考えることができる唯一の方法は、具体的な実装宣言をヘッダーから Win32System クラスの cpp ファイルに転送することですが、これを行うことには大きな欠点があります (これが機能するかどうかさえわかりません)。この cpp ファイルの一部でもあると、保守性の悪夢になります。
私が考えている別の解決策は、次のようなファクトリメソッドを使用することです
(RawInput.h)
IInputSystem* CreateRawInputSystem();
(RawInput.cpp)
class RawInput : public IInputSystem {}; ...
クラスの定義を cpp ファイルに移動しますが、ライブラリの他の部分 (つまり、Win32System impl) からこの型にアクセスするにはどうすればよいでしょうか?
他の .cpp ファイルから .cpp ファイルを含めることはできますか?
ヒントをお寄せいただきありがとうございます。