次の構造を初期化するための好ましいアプローチは何ですか? renderer_
次の例の問題は、コンストラクターを使用して初期化するためにクラスからの情報が必要ですwindow_
が、その情報はクラスが初期化された後にのみ利用可能であり、両方のインスタンスが同じメンバーであるため、両方のインスタンスが同時に初期化されることです。クラス。
class GraphicsManager
{
public:
GraphicsManager(
const std::string &windowTitle,
const int &windowWidth,
const int &windowHeight
) : window_(windowTitle,windowWidth,windowHeight),
renderer_(window_.getHandle()); //IMPOSSIBLE, I presume
private:
Window window_;
Renderer renderer_;
};
class Window
{
public:
Window() : windowHandle_(NULL);
Window(const std::string &title, const int &width, const int &height);
~Window();
SDL_Window *getHandle();
private:
SDL_Window *windowHandle_;
};
class Renderer
{
public:
Renderer() : rendererHandle_(NULL);
Renderer(SDL_Window *WindowHandle);
~Renderer();
private:
SDL_Renderer *rendererHandle_;
};
renderer_
のコンストラクターの初期化リストにGraphicsManager
まったく含めないため、暗黙的にrenderer_
のデフォルト コンストラクターを呼び出します。のコンストラクターの本体ではGraphicsManager
、適切に初期化Renderer
されたクラス インスタンスを空のに割り当てますrenderer_
。これは、のコンストラクターの本体で行うことができGraphicsManager
ますか?GraphicsManager( const std::string &windowTitle, const int &windowWidth, const int &windowHeight ) : window_(windowTitle,windowWidth,windowHeight) { //doable? is window_ initialized yet at this point? renderer_ = Renderer(window_.getHandle()); }
影響を受けるクラスに別のメソッドを追加
initialize(parameters)
し、コンストラクターに依存する代わりにそれらを使用してすべてを初期化しますが、初期化の責任をクラスのクライアントに委任しますか?クラスの構成/階層を別のものに変更しますか?