2013-07-13 3 views
0

Каким будет предпочтительный подход к инициализации следующей конструкции? Проблема в следующем примере заключается в том, что для инициализации 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) метод пострадавших классов и использовать их, чтобы инициализировать все вместо того, чтобы полагаться на конструктор, но при этом также делегировании является ответственным инициализации клиенту классов?

  • Изменение состава/иерархии классов на что-то еще?

ответ

3

и оба экземпляра инициализируются одновременно, поскольку они являются членами одного и того же класса.

Элементы-члены инициализируются в том порядке, в котором их объявления появляются в классе. Вы пытались:

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

Это должно работать так же хорошо.

+0

Элементы-члены инициализируются в том порядке, в котором они отображаются в определении класса. Заказ в списке инициализаций не имеет значения (хотя безопасно хранить его так же, как и порядок объявления). –

+0

Tadeusz, спасибо за исправление. Конечно, вы правы, иначе должен быть затронут порядок разрушения. Я отредактировал ответ. –

+0

Спасибо, я даже не потрудился проверить, работает ли он «как есть», поскольку я был уверен, что это невозможно. Я совершенно не знал о важности распоряжения о регистрации в этом отношении. – jms

Смежные вопросы