c ++:成员类之间的构造函数依赖项

时间:2013-07-13 10:12:22

标签: c++ constructor dependencies

初始化以下构造的首选方法是什么? 以下示例的问题是,为了使用它的构造函数初始化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)方法,以及 使用它们来初始化所有内容而不是依赖于构造函数,但是因此也将初始化的责任委托给类的客户端?

  • 将类的组成/层次结构更改为其他内容?

1 个答案:

答案 0 :(得分:3)

  

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

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

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

这应该也可以。