Array eines Objektes Initialisieren
-
Guten tag,
Ich habe folgendes Problem: Ich habe eine Klasse mit einem Konstruktor
mit einem Parameter.Nun möchte ich ein Array dieser Klasse erzeugen und für alle Klassen den
Konstruktor aufrufen und denen den selben Parameter zuweisen.Ich hätte da so grob an sowas gedacht (was halt nicht funktioniert),
[code]
TKlasse *ObjektArray;
ObjektArray = new TKlasse[3]{1,1,1};kann mir ja jemand helfen?
-
Kann jetzt falsch sein, aber probier einfach mal
ObjektArray = new TKlasse[3](1);.
-
nach new[] keine Liste.
Bei gleichen Werten würde std::vector einen geeigneten Konstruktor haben.
-
zum vector hätte ich da noch ne frage:
wenn ich einen Vector von meiner TKlasse erzeuge
und den Befehl
vector<TKlasse> Stapel;
Stapel.push_back(0);ausführe, dann hieße das dann ja, dass ich von TKlasse ein Objekt erzeuge, es in Stapel[0] speichere und es durch den Konstruktor mit dem Parameter 0 initialisieren würde, oder?
-
andersen schrieb:
wenn ich einen Vector von meiner TKlasse erzeuge
und den Befehlvector<TKlasse> Stapel; Stapel.push_back(0);ausführe, dann hieße das dann ja, dass ich von TKlasse ein Objekt erzeuge, es in Stapel[0] speichere und es durch den Konstruktor mit dem Parameter 0 initialisieren würde, oder?
push_back erwartet schon ein Objekt des Typs TKlasse als Parameter, welches dann in den Vektor kopiert wird. Damit dieser Aufruf so funktioniert, müsste TKlasse einen "Konvertierungskonstruktor" haben, der int akzeptiert. Ein Konvertierungskonstruktor ist ein impliziter Konstruktor, der mit einem Parameter aufrufbar ist. Ein impliziter Konstruktor ist ein Konstruktor, der mit einem Parameter aufrufbar ist und ohne das "explicit" Schlüsselwort deklariert wurde.
Ohne so einen impliziten Konstruktor musst Du von Hand ein Objekt erzeugen. ZB so:
class klasse { public: explicit klasse(double x); }; ... meinvector.push_back(klasse(3.1415));Das ist die "funktionale Syntax" zum Erzeugen eines temporären Objekts.
Das mit dem Weiterleiten der Konstruktor-Argumente wird es aber in der nächsten C++ Version geben. Die Funktion dazu wird "emplace_back" heißen.
kk
-
krümelkacker schrieb:
Das mit dem Weiterleiten der Konstruktor-Argumente wird es aber in der nächsten C++ Version geben. Die Funktion dazu wird "emplace_back" heißen.
Oh, die ist aber schön. Ich hab sie mir sofort in meine eigene Vector-Klasse gebaut und kann mir deswegen erstmal die Move-Semanik für Dateien sparen. Jetzt frage ich mich, ob push_back überhaupt noch einen Sinn hat, oder ob ich die getrost löschen kann.
-
erstmal danke krümelkacker.
Ist dieses schlüsselwort explicit zwingend notwendig, weil mein
compiler meckert nicht wenn ich, das ganze ohne ausführe.
-
andersen schrieb:
erstmal danke krümelkacker.
Ist dieses schlüsselwort explicit zwingend notwendig, weil mein
compiler meckert nicht wenn ich, das ganze ohne ausführe.Nein, überhaupt nicht notwendig. krümelkacker meinte noch nicht einmal, dass du es verwenden solltest. Mach dich mal kundig, was explicit macht, dann wird dir auch klar werden, was er meinte.