Мне нравится создавать композицию между классами A и B - скажем, в классе B есть член типа A. Перед инициализацией этого члена в качестве одного из конструкторов необходимо выполнить некоторые вычисления и / или дальнейшие шаги (класса А) параметры должны быть разработаны.Следовательно, инициализация через список инициализаторов нежелательна.
Единственный способ заставить это работать - это сделать некоторую предварительную инициализацию члена типа A в списке конструктора / инициализации (класса B), а затем переопределить этот член дальшевниз в конструкторе после получения параметра.
class A{
private:
int a;
int b;
public:
A(int x, int y): a(x), b(y) {}
}
class B{
private:
A objA;
public:
B(){
// some necessary steps to get say variable int w
objA = new A(w, w+1); // late initialization causes compile error, as
// all members need to be init once entering Ctor
}
Я думаю, что есть более элегантное решение, чем упомянутое ранее: двойная инициализация - сначала в списке инициализации (например, через B (): objA (0,0)), позже по мере необходимости (A (w, w + 1)).Спасибо!