Ich glaube, moderne C++ initializer Listen zur Initialisierung Objekten sehr nützlich sind, bis zu dem Punkt wodurch die Notwendigkeit für Ihren eigenen Konstruktor definieren:aktiviert Standard Initialisiererliste Konstruktor
struct point
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // nice !
Dies ist jedoch nicht funktioniert, wenn mein Klasse erbt von einer anderen Klasse:
template<typename T>
class serializable
{
protected:
serializable() = default;
...
// other stuff
}
struct point : public serializable<point>
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // Doesn't work :(
ich versuchte point() = default;
zu meinem Punkt Klasse hinzufügen, aber das hat nicht funktioniert entweder. Wie kann ich den Punkt mit einer Initialisierungsliste initialisieren?
danken, dass Sie klare und ausführliche Antwort. Diese Frage lässt mich fragen, warum der Standart so ist. Ich nehme an, es ist, weil Konstruktor s sonst nicht aufgerufen würde ... und vielleicht in einigen Fällen könnten sie Conflits zwischen den Konstruktoren und der Listeninitialisierung sein. Wie auch immer, da alle Konstruktoren '= default' sind, sollte das kein Problem verursachen. – Amxx
@Amxx Was wäre, wenn die Basisklassen Mitglieder hätten? Was wäre, wenn diese Mitglieder standardmäßig konstruierbar wären? Es ist unklar, was das "Richtige" in all diesen Fällen zu tun hat - so entscheidet sich der Standard, nicht zu raten. – Barry
Sie können Ihre Daten auch in eine Member- oder Basisklasse stopfen, wie zum Beispiel 'struct point_data {float coord [3]; } ', dann habe einen" perfekten Weiterleitungskonstruktor ", der' {} 'basierte Konstruktion davon macht. – Yakk