Реализация композиции - избегание списка инициализаторов - PullRequest
1 голос
/ 06 апреля 2019

Мне нравится создавать композицию между классами 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)).Спасибо!

1 Ответ

1 голос
/ 06 апреля 2019

Использовать делегирующий конструктор:

class B{
private:
    A objA;
public:
    B() : B(compute_w()){}

private:
    B(int w) : A(w, w+1) {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...