• Keine Ergebnisse gefunden

Problem: Wie initialisiert man Reihungen von Objekten?

N/A
N/A
Protected

Academic year: 2021

Aktie "Problem: Wie initialisiert man Reihungen von Objekten?"

Copied!
17
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ohne Zeiger kein Polymorphismus

S. Freud

(2)

Problem: Wie initialisiert man Reihungen von Objekten?

Antwort: Mit Konstruktoren in den

geschweiften Klammern

(3)

#include "meineKlasse.h"

int main(void) {

meineKlasse Objekt[5] = {meineKlasse(1), meineKlasse(2), meineKlasse(3), meineKlasse(4), meineKlasse(5)};

...

}

meineKlasse Objekt[5] = {1,2,3,4,5};

Auch möglich hier:

(4)

Sind wie Zeiger auf struct in C++ zu schreiben

Jedes Objekt besitzt einen besonderen Zeiger: this

this ist die Speicheradresse des Objekts

Typ ist Zeiger auf Klassentyp i. A.

Typ ist Zeiger auf konstanten

Klassentyp für const Klassen

(5)

class Reihung{

...

public:

Reihung copy(const Reihung&);

}

Reihung& Reihung::copy(const Reihung & rhs) {

if (this != &rhs){

groesse = rhs.groesse;

... //Feigling }

return *this;

(6)

Man achte auf den Fall für Selbst- Kopierung

Das Ergebnis ist die Kopie, d.h.

das Objekt, auf das kopiert wird

friend -Funktionen haben keine

Zugriffsberechtigung auf this

(7)

Wie immer, mit new

Dynamische Erzeugung von

Objekten verursacht Aufruf von Konstruktoren

Selbstgestrickte new gibt es auch

(8)

<p_var> = new <Typ>{[Groesse]}{(<InitWert>)}

delete {[]}<p_var>

(9)

Normalerweise mit new allozierter Speicher wird nicht initialisiert (wie malloc())

Initialisierung durch Konstruktoren

Reihungen können nicht so

initialisert werden (siehe oben)

delete ruft den Destruktor auf

(10)

Ohne Initialisierung

#include "meineKlasse.h"

int main(void){

meineKlasse *p = new meineKlasse;

if (!p){... return 0;}

p->setn(1);

...

delete p;

return 1;

}

(11)

mit Initialisierung

#include "meineKlasse.h"

int main() {

meineKlasse *p = new meineKlasse(5);

...

delete p;

return 0;

}

(12)

Allozierung von Reihungen von Klassen

#include "meineKlasse.h"

#include <iostream>

using namespace std; //ugh int main(void)

{

meineKlasse *p = new meineKlasse[20];

for (int i = 0; i < 20; i++) p[i].setn(i+1);

for (int i = 0; i < 20; i++) cout << p[i].getn()

<< endl;

delete[] p;

return 0;

(13)

Reihungsgrenzen können auch erst zur Laufzeit bekannt sein Dynamische Allozierung von

const Objekten auch möglich, z.B.

const float *p = new const float(3.14);

Bei

delete

für Reihungen von Klassenobjekten werden

Destruktoren aufgerufen

(14)

#ifndef _meineKlasse

#define _meineKlasse

#include <iostream>

using namespace std;

classe meineKlasse{

private:

int n;

public:

meineKlasse(){n = 0;}

meineKlasse(int m){n = m;}

~meineKlasse(){cout << "Destruktor aufgerufen" << endl;

int getn();

int getn() const;

void setn(int);

};

(15)

#include "meineKlasse.h"

int main(void) {

meineKlasse *p = new meineKlasse [10];

if (!p) ...

for (int i = 0; i < 10; i++)p[i].setn(2*i);

for (int j = 0, j < 10; j++) cout << p[j].getn() << " ";

cout << endl;

delete [] p;

return 0;

}

(16)

!

0 2 4 6 8 10 12 14 16 18 Destruktor aufgerufen

Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen

(17)

" #

! $

delete nicht korrekt angewandt.

Ergebnis: memory leak

delete auf ein Objekt mehrmals angewandt (z.B. über Zeiger).

Könnte ein neues Objekt korompieren!

Anwendung oder Zuweisung von Objekten nach Ihrer De-

Allozierung. Ergebnis:???

Referenzen

ÄHNLICHE DOKUMENTE

Schweizerisches Zentrum für Allergie, Haut und Asthma ist eine gemeinnützige Stiftung, die sich als Kompetenzzen- trum versteht und Einzelpersonen sowie Betrieben, Behörden

Die graue Maus rennt aus ihrem Haus und holt Futter.. Sie baut ein Nest

 Eine Variable in einer Reihung wird durch ihre Position innerhalb der Reihung bezeichnet, nicht durch einen eigenen Bezeichner.. – In einer Reihung von n Variablen mit dem

–&#34; Änderungen über den einen Verweis (über die eine Variable) beeinflussen also Objekte, die auch über den anderen Verweis (über die andere Variable) erreicht werden.!.

Pr ¨adiktion durch zeitliche Modellierung der Bewegung Nachf ¨uhrung der Kamera bei großen Bewegungsradien der Objekte: ”Halte Objekt m ¨oglichst im

Ist eine Oberklasse einer serialisierbaren Klasse nicht serialisierbar, so werden ihre privaten Felder nicht serialisert. Beim Deserialisieren wird der Konstruktor ohne Argumente

1324 verkaufte Andreas von Sunnberg dem Richter Marchart von Weifra 12 Holden und das Dorfgericht zu Ruekkers, die er selbst von Marchart und Hadmar von

J’entends encore la professeur de violoncelle de mon fils lui dire: «Tu sais, Pierre, en musique, quand ça ne sonne pas tout à fait juste, c’est complètement faux!» Il en va de