c ++ Lista inicjalizatorów konstruktorów ze złożonymi przypisaniami
Przypuśćmy, że chcę mieć konstruktor, który odbiera niektóre parametry, a dzięki tym parametrom mogę obliczyć wartości dla jego zmiennych składowych. Z wyjątkiem tego, że wartości zmiennych składowych nie są prostymi przypisaniami z parametrów. Wymagają utworzenia innych obiektów i transformacji wartości, zanim będą mogły być użyte jako wartości dla zmiennych składowych.
Jest to sposób, aby wcisnąć się w listę inicjalizacyjną. Również bardzo nieefektywny, ponieważ nie można tworzyć zmiennych i używać ich ponownie, więc trzeba będzie skopiować kod (i wykonać kilka kopii tego samego obiektu), aby zmieścić cały kod na liście inicjalizatora.
Inną opcją nie jest użycie listy inicjalizującej i wywołanie domyślnego konstruktora, a następnie nadpisanie wartości wewnątrz konstruktora prostymi obliczeniami.
A co jeśli klasa nie ma domyślnego konstruktora? Jak można to zrobić starannie?
/* a class without a default constructor */
class A {
public:
B x1
B x2
A(B x1_, B x2_) : x1{x1_}, x2{x2_} {};
};
/* a class that contains an A object and needs to initialize it based on some complex logic */
class C {
public:
A a;
C(D d) :
a{b1,b2} // ultimately I just want to initialize a with two B objects
// but unfortunatelly they require a lot of work to initialize
// including instantiating other objects and using tons of methods
{}
};