我正在爲C++
中的項目設計一些類,但我遇到了問題。 我想創建一個camera
類,它包含所有需要的值(例如轉換矩陣),但是呈現camera
的函數應該是可交換的。這聽起來像是戰略模式的常見案例。因此,我創建了一個界面,該界面定義了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;
};
這似乎並不成爲一個優雅的解決方案,由於責任到infity環路(在ICameraRender
的render-function
調用camera->renderCamera()
)。有沒有更好的解決這個問題?
問候
編輯:
我想出了另一種解決方案。由於對攝像機數據進行操作的功能只需要訪問數據,因此我認爲我可以將攝像機類本身分開。一個名爲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;
};
現在渲染功能(只根據用戶輸入的計算相機新值)也不再有機會獲得renderCamera-功能。 您對這個解決方案有什麼看法?
問候斯坦
將攝像頭用作渲染器使用的某些東西會更有意義,而不是相反。也就是說,渲染器被賦予一個或多個攝像機,其視角必須根據攝像機的狀態呈現。你確定你正在以正確的方式去做嗎? –
這正是我想要做的。我想我爲這些功能選擇了錯誤的名稱。 :) 相機得到一些輸入,因此它應該計算新的位置和旋轉等。實際的渲染器可以通過getter方法訪問這些數據。 – Stan