wierzę nowoczesną C++ list initializer są bardzo przydatne do inicjalizacji obiektów, do tego stopnia, co eliminuje konieczność definiowania własnego konstruktora:Włącz domyślna lista Inicjator konstruktora
struct point
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // nice !
Jednak to nie działa, gdy mój Klasa dziedziczy z innej klasy:
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 :(
próbowałem dodanie point() = default;
do mojej klasy punkt, ale to nie działało. Jak mogę jeszcze zainicjować punkt z listą inicjalizatora?
podziękować za ciebie jasnych i szczegółowych odpowiedzi. To juste sprawia, że zastanawiam się, dlaczego standart jest taki. Zgaduję, że to dlatego, że konstruktory nie byłyby inaczej nazywane ... i może w niektórych przypadkach mogą być conflits między konstruktorami i inicjowanie listy. Jednakże, podobnie jak wszystkie konstruktory są '= default', które nie powinny powodować żadnego problemu – Amxx
@Amxx Co jeśli klasy bazowe miały członków? A co, jeśli członkowie ci byliby domyślni? Nie jest jasne, co należy robić we wszystkich tych przypadkach - więc standard nie chce zgadywać. – Barry
Możesz także spakować swoje dane do elementu lub klasy bazowej, na przykład 'struct point_data {float coord [3]; } ', a następnie" doskonały konstruktor przekazujący ", który opiera się na' {}. – Yakk