Konstruktor manuell aufrufen!!!!
-
perfekt..... thx jungs.... die welt ist groß in c++...;)
-
Beachte, Konstruktoren lassen sich nicht explizit aufrufen!
Hm, wenn man ein palcement new schreibt, muss man dann nicht den Konstruktor aufrufen ? *nie gemacht* aber ich kann Destruktoren explizit aufrufen, also wird es mit konstruktoren auch gehen ???
-
Knuddlbaer schrieb:
Beachte, Konstruktoren lassen sich nicht explizit aufrufen!
Hm, wenn man ein palcement new schreibt, muss man dann nicht den Konstruktor aufrufen ? *nie gemacht* aber ich kann Destruktoren explizit aufrufen, also wird es mit konstruktoren auch gehen ???
^^ wir sind hier nicht bei dynamischen Objekten
...
aber da schreibst du ja auch nicht new A.A() sondern auch A, aber im Prinzip hast du Rechtclass A { public: A(int y); ~A(); }; A* mya = new A(12); //... mya->~A(); // Destruktor manuell aufrufen //... new (mya) A(13);
Ich glaub, so kann man mit "placement new" arbeiten, bin aber net sicher
-
Knuddlbaer schrieb:
Hm, wenn man ein palcement new schreibt, muss man dann nicht den Konstruktor aufrufen ?
No, du benutzt ja new ganz normal und erzeugst das Objekt nur in nen von dir vorher bereitgestellten Speicher...
Den Destruktor musst du allerdings dann beim Löschen des Objekt manuell aufrufen und dananch deinen Speicher auch freigeben, da beim direkten Objekt freigeben der Destruktor nicht aufgerufen wird bzw das Verhalten undefiniert ist, da dieses Objekt nicht mit operator new erzeugt wurde sondern dein Roh-Speicher...
-
Ah so langsam dämmerts wieder
Danke Dir!
-
kann man denn aus einem bestimmten Konstruktor auch einen anderen der gleichen klasse aufrufen?
Fand das bei java immer so schön, zum schreibarbeit sparen.
bsp.:class A{ A(int x){ bla bla} A(int x, int y):A(x){bla bla} }
geht das so oder irgendwie anders?
ich weiß natürlich, daß man in der deklararion auch default werte angeben kann, aber die müssen in einer bestimmten reihenfolge sein, das ist dann nicht das gleiche.
thx
-
also mir wirft der Compiler da ne Fehlermeldung, davon, dass es das geben könnte hatte ich auch noch nie gehört
-
ja eben, ich auch nich(habs ja schon ausprobiert), aber bei java kann man das sogar innerhalb eines constructors:
A(int x, int y, int z)
{
A(x);
A(x,y);
bla bla;
}
und ich hoff ja nur, daß das das irgendwie geht.
sonst kann man ja auch die entsprechenden aufrufe in andere (init)funktionen auslagern aber, na ja.
vielleicht kennt sich ja noch jemand aus?!? is ja auch nich dringend/zwingend
, cya
-
Konstruktion ist in C++ viel strikter, klarer, logischer und effizienter geregelt. Ein Konstruktor entspricht einer kompletten Konstruktion und nicht einer Teil-Konstruktion. Wobei ein Java-Konstruktor eigentlich auch keine Teil-Konstruktion macht, obwohl es so aussieht. In Java ist der Konstruktor aber überhaupt kein echter Konstruktor, sondern ein After-Konstruktor. Die Konstruktion ist innerhalb des Java-Konstruktors schon komplett abgeschlossen. Das sieht man z. Bsp. daran, dass man sogar auf Überschreibungen von virtuellen Methoden zugreifen kann. Nichtsdestotrotz wäre es natürlich praktisch, wenn es in C++ einen Post-Konstruktor-Event gäbe, so dass man auch für z. Bsp. pure-virtual Methoden festlegen könnte, dass sie innerhalb eines Blocks auftauchen sollen, der genau einmal aufgerufen wird (quasi Nachgeburt :D).
Falls es aber nur darum geht verschiedenen Konstruktoren gemeinsame Funktionalität zu gewähren, so tut es wirklich nicht weh, sich eine (evtl. private) Methode mit allen möglichen Parametern zu machen, die dann von den einzelnen Konstruktoren aufgerufen wird. Hier ein Beispiel für eine Vektorklasse, deren Konstruktoren eine gemeinsame Initialisierungsmethode benutzen:template<typename T> class Vector { public: Vektor(T x, T y, T z) { setValues(x, y, z); } Vektor(T value) //Hier würde man gerne Vektor(value, value, value) aufrufen, aber es darf, //im Gegensatz zu gemeinsamen Initialisierungsmethoden, nur ein einziger echter Konstruktor aufgerufen werden { setValues(value, value, value); //Ist aber auch nicht wild } inline void setValues(T x, T y, T z) { m_x = x; m_y = y; m_z = z; } private: T m_x, m_y, m_z; };
-
Object* o = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Object)); new (o) Object(Parameter);
-
QarateKid schrieb:
kann man denn aus einem bestimmten Konstruktor auch einen anderen der gleichen klasse aufrufen?
Fand das bei java immer so schön, zum schreibarbeit sparen.
bsp.:class A{ A(int x){ bla bla} A(int x, int y):A(x){bla bla} }
geht das so oder irgendwie anders?
ich weiß natürlich, daß man in der deklararion auch default werte angeben kann, aber die müssen in einer bestimmten reihenfolge sein, das ist dann nicht das gleiche.
thxJap, genau so geht das ab C++11. Ich weiß nicht, ob MSVC2012 das schon unterstützt, MSVC2010 wsl nicht und MSVC2013 vermutlich schon.
-
Ich denke, BorisDieKlinge braucht diese Antworten schon lange nicht mehr.