Hey Danke dir für die Super Videos. Super erklärt. Welchen Sinn macht es einen Pointer auf ein Objekt zu machen? Statt eimem . nehme ich -> Wofür benötige ich sowas?
Warum verwendet man jetzt new Car? Für eine normale Instanz würde man doch Car car = Car(); verwenden? Könne man dann nicht einfach für einen Pointer auf car Car* pointer = &car; machen?
Grundsätzlich geht das. Der große Unterschied liegt darin, wo das Car gepseichert wird bzw. wie lange es gespeichert wird. Car car = Car(); Wird auf dem Stack gespeichert und ist deshalb nur innerhalb der entsprechenden Funktion verfügbar. Es wird also im Endeffekt automatisch am Ende der Funktion gelöscht. Testen kann man das dann z.B. mit einem Destruktor. Mit new Car() wird die Klasse allerdings auf dem Heap erzeugt. Das bedeutet, dass diese auch nach dem Verlassen der Funktion verfügbar ist. Wenn der Speicher nicht mehr benötigt wird muss man diesen manuell mit delete car; wieder freigeben. Aufpassen muss man, wenn man einen Zeiger auf eine Klasse als return zurück gibt. In diesem Fall muss das Objekt zwingend auf dem Heap erstellt worden sein. Andernfalls wird ein Zeiger auf Speicher zurück gegeben, der durch das beenden der Funktion wieder frei geben wird. Also niemals Car* createCar() { Car car; return &car; }
+Zombistriker 8 Nein habe ich noch nicht, ich werde aber Mal schauen, dass ich das in einem der kommenden Videos mal einbaue oder einen extra Part mache
Wie würde ich jetzt ein Objekt erstellen, wenn ich den Constructor vorher mit Attributen deklariert habe? Also als Beispiel: Car :: car(float velocity, float position) { } Wenn ich dann Car* car = new Car schreibe, läuft das Programm nicht...
Hey Pilzschaf, bei mir wird bei car -> accelerate(2.0f) ebenfalls der Destructor auf der Konsole ausgegeben. Ich benutze CLion mit 2020 C++ und gcc/g++. Das delete car; car = nullptr; gibt mir auch einen Fehler.
Das ist in der Tat merkwürdig. Ist car ein Zeiger der mit new erstellt wurde? Oder ist car bei dir einfach nur ein Zeiger auf eine normale Car Instanz auf dem Stack?
@@Leonardo-eu7jt Ok, da sollte der Destruktor definitiv erst beim delete aufgerufen werden. Kann es sein, dass du vielleicht Konstruktor und Destruktor verwechselst?
sehr cool deine videos auch nach 6 jahren noch, hab mich nie so richtig an das c zeug rangetraut aber die videos sind super :>
Hey Pilzschaf bei 5:45 musst du schreiben (*Car).accelerate ()
Hey Danke dir für die Super Videos.
Super erklärt.
Welchen Sinn macht es einen Pointer auf ein Objekt zu machen?
Statt eimem . nehme ich ->
Wofür benötige ich sowas?
Hey Pilzschaf ich hab leider nicht ganz verstanden warum wir den Pen-Pointer im private Bereich der Car-Klasse machen. Bei 11:01
Warum verwendet man jetzt new Car?
Für eine normale Instanz würde man doch
Car car = Car();
verwenden? Könne man dann nicht einfach für einen Pointer auf car
Car* pointer = &car;
machen?
Grundsätzlich geht das. Der große Unterschied liegt darin, wo das Car gepseichert wird bzw. wie lange es gespeichert wird. Car car = Car(); Wird auf dem Stack gespeichert und ist deshalb nur innerhalb der entsprechenden Funktion verfügbar. Es wird also im Endeffekt automatisch am Ende der Funktion gelöscht. Testen kann man das dann z.B. mit einem Destruktor. Mit new Car() wird die Klasse allerdings auf dem Heap erzeugt. Das bedeutet, dass diese auch nach dem Verlassen der Funktion verfügbar ist. Wenn der Speicher nicht mehr benötigt wird muss man diesen manuell mit delete car; wieder freigeben. Aufpassen muss man, wenn man einen Zeiger auf eine Klasse als return zurück gibt. In diesem Fall muss das Objekt zwingend auf dem Heap erstellt worden sein. Andernfalls wird ein Zeiger auf Speicher zurück gegeben, der durch das beenden der Funktion wieder frei geben wird. Also niemals
Car* createCar() {
Car car;
return &car;
}
@@Pilzschaf Vielen Dank für die schnelle Antwort!
Und auch vielen Dank für die vielen guten Tutorials
Dankeschön ; )
Schau mal hier vorbei, da ging es ab Minute 9 auch um mehrdimensionale Arrays
th-cam.com/video/YgzqbJjzOok/w-d-xo.html
Danke =)
Danke für das informative Video!, übrigens die andere Schreibweise von _Car->brake()_ wäre _(*Car).brake();_
Cooles Video!
Danke :)
Ich hätte ne Frage hast du schon ein Video über 2d Arrays und 2. falls neinkönntest du bitte eines machen
Danke ; )
+Zombistriker 8 Nein habe ich noch nicht, ich werde aber Mal schauen, dass ich das in einem der kommenden Videos mal einbaue oder einen extra Part mache
geil erklärt danke dir =)
Wie würde ich jetzt ein Objekt erstellen, wenn ich den Constructor vorher mit Attributen deklariert habe?
Also als Beispiel:
Car :: car(float velocity, float position)
{
}
Wenn ich dann Car* car = new Car schreibe, läuft das Programm nicht...
Du musst in dem Fall dann bei new Car die Parameter in Klammer mitgeben. Also Car* car = new Car(10.0f, 5.0f);
@@Pilzschaf Danke!
Hey Pilzschaf, bei mir wird bei car -> accelerate(2.0f) ebenfalls der Destructor auf der Konsole ausgegeben. Ich benutze CLion mit 2020 C++ und gcc/g++. Das delete car; car = nullptr; gibt mir auch einen Fehler.
Das ist in der Tat merkwürdig. Ist car ein Zeiger der mit new erstellt wurde? Oder ist car bei dir einfach nur ein Zeiger auf eine normale Car Instanz auf dem Stack?
@@Pilzschaf
Car* car1 = new Car;
car1 -> accelerate(2.0f);
@@Leonardo-eu7jt Ok, da sollte der Destruktor definitiv erst beim delete aufgerufen werden. Kann es sein, dass du vielleicht Konstruktor und Destruktor verwechselst?
@@Pilzschaf Nein, es wird beides ausgegeben.
Car::Car() {
std::cout
Und der Destruktor wird auch aufgerufen, wenn du delete nicht aufrufst?