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's 构造函数的主体中,我会将一个正确初始化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

3

并且两个实例同时初始化,因为它们都是同一类的成员。

成员变量按照它们的声明出现在类中的顺序进行初始化。你试过这个:

GraphicsManager(
    const std::string &windowTitle,
    const int &windowWidth,
    const int &windowHeight
    ) : window_(windowTitle,windowWidth,windowHeight), renderer_(window_.getHandle())
{
}

这应该也可以。

于 2013-07-13T10:37:45.393 回答