現在、プロジェクト用にいくつかのクラスを設計していますC++
が、問題が発生しました。camera
必要なすべての値(変換行列など)を保持するクラスを作成したいのですが、をレンダリングする関数はcamera
交換可能である必要があります。これは、戦略パターンの通常のケースのように聞こえます。したがって、を定義するインターフェイスを作成し、このインターフェイスにクラスaをrender-function
与えました。問題は、クラス内のすべてのデータにアクセスする必要があるため、この関数にパラメーターとしてクラスへのポインターを指定したことです。次のようになります。camera
pointer
render function
camera
camera
#include "ICameraRender.h"
class Camera{
private:
ICameraRender* _cameraRender;
public:
Camera();
Camera(ICameraRender& cameraRender);
~Camera();
void renderCamera(){ _cameraRender->render(this); }
void setCameraRender(ICameraRender& cameraRender);
/..../
};
class ICameraRender{
public:
virtual ~ICameraRender(){
}
//Override me
virtual void render(Camera* camera) = 0;
};
camera->renderCamera()
これは、インフィティループ( inrender-function
を呼び出す)に対する責任があるため、エレガントなソリューションではないようですICameraRender
。この問題に対するより良い解決策はありますか?
よろしく
編集:
私は別の解決策を思いついた。カメラのデータを操作する機能なので、データにアクセスするだけで、カメラクラス自体を分割できると思いました。CameraおよびCameraModelと呼ばれるクラス。最後のデータは必要なすべてのデータを保持し、最初のデータはそのデータに対して操作を実行します。したがって、CameraModelへのポインターを関数に渡す必要があります。
class CameraModel{
private:
/...data.../
public:
/...setter and getter.../
};
class Camera{
private:
CameraModel* _cameraModel;
ICameraRender* _cameraRender;
public:
Camera();
Camera(ICameraRender& cameraRender);
~Camera();
void renderCamera(){ _cameraRender->render(_cameraModel); }
void setCameraRender(ICameraRender& cameraRender);
/..../
};
class ICameraRender{
public:
virtual ~ICameraRender(){
}
//Override me
virtual void render(CameraModel* cameraModel) = 0;
};
これで、render-function(ユーザー入力に従ってカメラの新しい値のみを計算する)は、renderCamera-functionにアクセスできなくなります。このソリューションについてどう思いますか?
よろしくスタン