私は現在、レンダリングに DirectX を使用して、C++ で小さなゲーム エンジン プロジェクトに取り組んでいます。エンジンのレンダリング部分は、 や などのクラスで構成されModel
ますTexture
。別のレンダリング ライブラリ (OpenGL など) への切り替えを (比較的) シンプルに保ちたい (そして、それが適切なカプセル化だと思うため) ため、これらのクラスのパブリック インターフェイスから DirectX への参照を完全になくしたいと考えています。などのパブリック関数を提供することは避けたいと思いID3D11ShaderResourceView* GetTextureHandle();
ます。
ただし、 のようなクラスがタスクを実行するためにModel
使用される内部テクスチャ ハンドルを必要とする場合 (たとえば、実際にモデルをレンダリングする場合)、これは問題になります。Texture
簡単にするために、DirectX を、Lib3D と呼ぶ任意の 3D レンダリング ライブラリに置き換えましょう。私が直面している問題を示す例を次に示します。
class Texture {
private:
Lib3DTexture mTexture;
public:
Texture(std::string pFileName)
: mTexture(pFileName)
{
}
};
class Model {
private:
Texture* mTexture;
Lib3DModel mModel;
public:
Model(std::string pFileName, Texture* pTexture)
: mTexture(pTexture), mModel(pFileName)
{
}
void Render()
{
mModel.RenderWithTexture( /* how do I get the Lib3DTexture member from Texture? */ );
}
};
もちろん、単に へのポインターを返すパブリックGetTextureHandle
関数を に提供することもできますが、これは、基になるレンダリング ライブラリを変更すると、その関数によって返される型も変更する必要があり、したがって のパブリック インターフェイスを変更する必要があることを意味します。さらに悪いことに、新しいライブラリは同じように構成されていない可能性があります。つまり、まったく新しい機能を提供する必要があります。Texture
mTexture
Texture
私が考えることができる最善の解決策は、のメンバーに直接アクセスできるようにModel
の友達を作ることです。ただし、. 私は友情をあまり使ったことがないので、これが許容できる使用例であるかどうかはわかりません.Texture
Texture
Texture
だから、私の質問は次のとおりです。
- Model を Texture のフレンドとして宣言することは、フレンドシップの使用として許容されますか? それは良い解決策でしょうか?
- いいえの場合、何をお勧めしますか? クラス構造を完全に再設計する必要がありますか? その場合、何かヒントはありますか?
PS: タイトルがあまり説明的でないことは承知しており、申し訳ありませんが、どのように言えばよいかわかりませんでした。