Как избежать дублирования кода в списках инициализаторов - PullRequest
2 голосов
/ 14 марта 2019

У меня есть класс D, унаследованный от B:

struct D: public B {
    D(int b1, int p);
    D(int b1, int b2, int p);
    int p1;
    float p2;
    double p3;
    std::string p4;
};

Код Contructors тот же, за исключением использования базового класса:

 D::D(int b1, int p): B(b1)
 , p1(p)
 , p2(SomeFunc())
 , p3(SomeOtherFunc() - 42)
 , p4("abc")
 {}

 D::D(int b1, int b2, int p): B(b1, b2)
 , p1(p)
 , p2(SomeFunc())
 , p3(SomeOtherFunc() - 42)
 , p4("abc")
 {}

Вопрос: есть ли способ сделать код более компактным и менее "скопированным"?

Ответы [ 2 ]

5 голосов
/ 14 марта 2019

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

// Assuming default value of b2 is 0.
D::D(int b1, int p): D(b1, 0, p) {}

 D::D(int b1, int b2, int p): B(b1, b2)
 , p1(p)
 , p2(SomeFunc())
 , p3(SomeOtherFunc() - 42)
 , p4("abc")
 {}

См. http://www.stroustrup.com/C++11FAQ.html#delegating-ctor для получения дополнительной информации о делегировании конструкторов.

3 голосов
/ 14 марта 2019

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

struct D: public B {
    D(int b1, int p);
    D(int b1, int b2, int p);
    int p1;
    float p2;
    double p3;
    std::string p4;
};

можно изменить на

struct D: public B {
    D(int b1, int p);
    D(int b1, int b2, int p);
    int p1;
    float p2{SomeFunc()};
    double p3{SomeOtherFunc() - 42};
    std::string p4{"abc"};
};

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

D::D(int b1, int p): B(b1), p1(p) {}

D::D(int b1, int b2, int p): B(b1, b2), p1(p) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...