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())
{
}

这也应该起作用。

成员变量按照它们在类定义中出现的顺序进行初始化。初始值设定项列表中的顺序是不相关的(尽管保持与声明顺序相同是安全的)。你当然是对的,否则破坏的顺序就会受到影响。我编辑了答案。谢谢,事实上我甚至没有费心去测试它是否“按原样”工作,因为我确信它无法完成。我完全不知道声明顺序在这方面的重要性。成员变量是按照它们在类定义中出现的顺序初始化的。初始值设定项列表中的顺序是不相关的(尽管保持与声明顺序相同是安全的)。你当然是对的,否则破坏的顺序就会受到影响。我编辑了答案。谢谢,事实上我甚至没有费心去测试它是否“按原样”工作,因为我确信它无法完成。我完全不知道申报令在这方面的重要性。