Ich möchte eine Membervariable einer abgeleiteten Klasse initialisieren und anschließend an den Basisklassenkonstruktor übergeben. Ich habe die folgende Lösung gefunden (auch hier: http://cpp.sh/4uu4q)Initialize Abgeleitete Klassenmitgliedsvariable vor dem Aufruf des Basisklassenkonstruktors. Ist das UB?
1) Hat der folgende Code ein definiertes oder undefiniertes Verhalten (UB)?
2) Ist das, was ich versuche, ein Anzeichen für ein schlechtes Design?
struct Data {
int fValue;
Data(int value = -1) : fValue(value)
{}
};
struct Base {
Base(const std::unique_ptr<Data> & derivedData) {
std::cout << "Constructing Base derivedData=" << derivedData->fValue << std::endl;
}
};
struct Derived : public Base {
std::unique_ptr<Data> fData = std::move(fData);
Derived() : Base(ConstructData())
{}
const std::unique_ptr<Data> & ConstructData() {
fData.release();
fData.reset(new Data(777));
std::cout << "in ConstructData: fData->fValue =" << fData->fValue << std::endl;
return fData;
}
};
int main() {
Derived d;
std::cout << "In main: d.fData->fValue =" << d.fData->fValue << std::endl;
return 0;
}
2) Ja, warum muss Ihre Basisklasse über den abgeleiteten in seinem Konstruktor wissen? – user463035818
Die abgeleitete Klasse wird erst aufgebaut, nachdem ihre Basisklassen erstellt wurden. Das ist UB. –
Sie bedienen fData, bevor der Konstruktor aufgerufen wurde, also ist es ein UB. –