C++:成员类之间的构造函数依赖关系

c++: constructor dependancy between member classes

本文关键字:函数依赖 关系 成员类 之间 C++      更新时间:2023-10-16

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

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

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

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

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

这应该也一样有效。