初始化以下构造的首选方法是什么?
以下示例的问题是,为了使用它的构造函数初始化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)
方法,以及
使用它们来初始化所有内容而不是依赖于构造函数,但是因此也将初始化的责任委托给类的客户端?
将类的组成/层次结构更改为其他内容?
答案 0 :(得分:3)
并且两个实例同时初始化,因为它们都是同一个类的成员。
成员变量按其声明在类中出现的顺序进行初始化。你试过这个:
GraphicsManager(
const std::string &windowTitle,
const int &windowWidth,
const int &windowHeight
) : window_(windowTitle,windowWidth,windowHeight), renderer_(window_.getHandle())
{
}
这应该也可以。