Каким будет предпочтительный подход к инициализации следующей конструкции? Проблема в следующем примере заключается в том, что для инициализации renderer_
с использованием его конструктора мне нужна информация из класса window_
, но информация доступна только после того, как указанный класс был инициализирован, и оба экземпляра инициализируются одновременно, поскольку оба они являются членами одного класса.C++: зависимость конструктора между классами-членами
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
'конструктор s на всех, таким образом, косвенно называяrenderer_
' s конструктор по умолчанию. В теле конструктора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)
метод пострадавших классов и использовать их, чтобы инициализировать все вместо того, чтобы полагаться на конструктор, но при этом также делегировании является ответственным инициализации клиенту классов?Изменение состава/иерархии классов на что-то еще?
Элементы-члены инициализируются в том порядке, в котором они отображаются в определении класса. Заказ в списке инициализаций не имеет значения (хотя безопасно хранить его так же, как и порядок объявления). –
Tadeusz, спасибо за исправление. Конечно, вы правы, иначе должен быть затронут порядок разрушения. Я отредактировал ответ. –
Спасибо, я даже не потрудился проверить, работает ли он «как есть», поскольку я был уверен, что это невозможно. Я совершенно не знал о важности распоряжения о регистрации в этом отношении. – jms