C++ c++;:成员类之间的构造函数依赖性
初始化以下构造的首选方法是什么? 以下示例的问题是,为了使用它的构造函数初始化C++ c++;:成员类之间的构造函数依赖性,c++,constructor,dependencies,C++,Constructor,Dependencies,初始化以下构造的首选方法是什么? 以下示例的问题是,为了使用它的构造函数初始化渲染器,我需要类窗口中的信息,但这些信息只有在所述类初始化之后才可用,并且两个实例都是同时初始化的,因为它们都是同一个类的成员 class GraphicsManager { public: GraphicsManager( const std::string &windowTitle, const int &windowWidth, const
渲染器
,我需要类窗口中的信息,但这些信息只有在所述类初始化之后才可用,并且两个实例都是同时初始化的,因为它们都是同一个类的成员
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_;
};
- 根本不在
GraphicsManager
的构造函数的初始化列表中包括呈现程序
,因此隐式调用呈现程序
的默认构造函数。在GraphicsManager
的构造函数主体中,我将为空的渲染器分配一个正确初始化的渲染器
类实例。在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)
方法,以及
使用它们来初始化所有的东西,而不是依赖构造函数,但也因此将初始化的责任委托给类的客户机
- 将类的组成/层次结构更改为其他内容
两个实例都是同时初始化的,因为它们都是同一类的成员
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_;
};
成员变量按照其声明在类中出现的顺序初始化。你试过这个吗:
GraphicsManager(
const std::string &windowTitle,
const int &windowWidth,
const int &windowHeight
) : window_(windowTitle,windowWidth,windowHeight), renderer_(window_.getHandle())
{
}
这也应该起作用
两个实例都是同时初始化的,因为它们都是同一类的成员
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_;
};
成员变量按照其声明在类中出现的顺序初始化。你试过这个吗:
GraphicsManager(
const std::string &windowTitle,
const int &windowWidth,
const int &windowHeight
) : window_(windowTitle,windowWidth,windowHeight), renderer_(window_.getHandle())
{
}
这也应该起作用。成员变量按照它们在类定义中出现的顺序进行初始化。初始值设定项列表中的顺序是不相关的(尽管保持与声明顺序相同是安全的)。你当然是对的,否则破坏的顺序就会受到影响。我编辑了答案。谢谢,事实上我甚至没有费心去测试它是否“按原样”工作,因为我确信它无法完成。我完全不知道声明顺序在这方面的重要性。成员变量是按照它们在类定义中出现的顺序初始化的。初始值设定项列表中的顺序是不相关的(尽管保持与声明顺序相同是安全的)。你当然是对的,否则破坏的顺序就会受到影响。我编辑了答案。谢谢,事实上我甚至没有费心去测试它是否“按原样”工作,因为我确信它无法完成。我完全不知道申报令在这方面的重要性。