0

次の構造を初期化するための好ましいアプローチは何ですか? 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)し、コンストラクターに依存する代わりにそれらを使用してすべてを初期化しますが、初期化の責任をクラスのクライアントに委任しますか?

  • クラスの構成/階層を別のものに変更しますか?

4

1 に答える 1