Seite 1 von 1

Verwirrung mit Arrays

Verfasst: 31. August 2013 21:29
von Kai78
Hallo

Ich bin noch relativ neu in der der C++ Programmierung und bin heute auf ein Problem mit Arrays gestossen das mich nun vollends verwirrt hat.
Es geht um Arrays die Objekte speichern.
Einerseits geht dies ja mit einem 2D-Array

Code: Alles auswählen

meineKlasse **mK1 = new meineKlasse*[4];
for (int i = 0; i < 4; ++i) {
mK1[i] = new meineKlasse[8];
}
mK1[1][1].Objektmethode();
Als auch mit einem 1D-Array

Code: Alles auswählen

meineKlasse *mK1 = new meineKlasse[4];
mK[1].Objektmethode(); 
Heute zeigte unser Dozent, dass es es auch noch folgendermassen geht.

Code: Alles auswählen

meineKlasse **mK1 = new meineKlasse*[4];
for (int i = 0; i < 4; ++i) {
mK1[i] = new meineKlasse();
}
//keine Ahnung wie man dann auf die Objektmethoden zugreifen kann
Zur Ergänzung kann ich noch sagen, dass es sich hier um die Verwendung von der QLineEdit Klasse handelt.
Warum gibt man hier in der For-Schleife nicht die zweite Dimension an und wie greife ich hier auf die Objektmethoden zu?
Für hilfreiche Antworten danke ich jetzt schon vielmals.

Re: Verwirrung mit Arrays

Verfasst: 1. September 2013 15:00
von veeman
Dein 2D Array ist nicht wirklich ein 2D-Array sondern vereinfacht gesagt eine List mit Zeigern.

Ein Zeiger kann entweder auf ein Objekt oder wiederum auf eine Objektliste zeigen, wobei beim letzteren sichergestellt sein sollte dass die Größe bekannt ist und eingehalten wird.

Was dein Dozent gemacht hat ist eine einfache Liste mit Objekten anzulegen.
Auf das jeweilige Objekt kannst du dann entweder durch explizite Dereferenzierung oder mit dem, ich nenne es mal "Zeigeroperator" (heisst glaub ich anders) zugreifen:

Code: Alles auswählen

(*mK1[i]).Objektmethode();

oder

mK1[i]->Objektmethode();
Mfg veeman

Re: Verwirrung mit Arrays

Verfasst: 1. September 2013 17:10
von Christian81
Und wenn wir schon C++ (und nicht C) programmieren dann doch bitte auch C++ benutzen:

Code: Alles auswählen

std::vector<std::vector<meineKlasse*> > meineKlasseArray;

Re: Verwirrung mit Arrays

Verfasst: 1. September 2013 17:33
von Kai78
Danke für die Antworten.
Vektoren hatten wir leider noch nicht weshalb wir es mit Arrays machen sollen :roll:
Was ich leider noch nicht ganz verstehe was mir diese Liste mit Zeigern bringt.
Es funktioniert doch folgendermassen genau gleich...

Code: Alles auswählen

QLineEdit *LE = new QLineEdit [50];
LE[1].setText("Hallo Welt");
Was gibt es da für Gründe dass man eine Liste mit Zeigern verwendet?

Re: Verwirrung mit Arrays

Verfasst: 2. September 2013 06:53
von Christian81
Viele Wege führen nach Rom würde ich sagen...

Re: Verwirrung mit Arrays

Verfasst: 2. September 2013 14:08
von Kai78
hehe ja schon aber welcher ist der kürzeste in solch einem Fall.

Re: Verwirrung mit Arrays

Verfasst: 3. September 2013 11:14
von RHBaum
das sieht aber bissi anders aus, wie es im Speicher so da liegt ....

Code: Alles auswählen

QLineEdit *LE = new QLineEdit [50]
erzeugt aufm heap 50 QLineEdit Objecte (verwaltungsdaten etc.)
Speicherverbrauch 50 x sizeof(QLineEdit) am Stück.
hab keine Ahnung wie gross QLineEdit ist ...

die andere Variante erzeugt nen Array von zeigern ....
und allokiert auf die zeiger nen Object ....
bleiben wir mal bei 50 und QLineEdit
Speicherverbrauch:
50 mal sizeof(QLineEdit)
50 mal size(void *) als block
nur die zeiger muessen am stueck liegen. also bei 32bit: 50x4byte = 200byte waehrend die QLineEdit Instanzen irgendwo verteilt aufm Heap rumliegen koennen.

was besser ist:

generell ist das c-style
in c++ hasst du keinerlei begruendung mehr, ein new T[] anzulegen, da gibts immer bessere alternativen.
auch kannst du new generell fast immer ersetzen (ausser bei Qt, da verwendest es wiederum haeufig, dank QObject Hirarchie)
also nur fuer "Lernzwecke" verwenden.

fuers allokieren, ein new mit viel speicher versus viel news mit weniger speicher:
news sind langsam !
Speicher am Stueck kann ab gewissen groessen problematisch werden
viele kleine speicherhaepchen - fragmentierung des Speichers.

also wenn man genug speicher hat, sind grosse Bloecke effektiver !

in C (mikrokontroller) macht man es eh tendendiell so: speicher alles gleich am anfang allokieren und Speicher selber verwalten.
bei groesseren PC Programmen geht das schlecht.

die STL und teilweisse die c++ runtimes ham eh nen Allokator, der small object allokierungen abfaengt, so das in stl containeren ein insert oder das new nicht jedesmal ins betriebssystem durchschiesst.

manchmal isses auch abwaegungssache ...

Ciao ...