Verwirrung mit Arrays

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Kai78
Beiträge: 3
Registriert: 31. August 2013 20:56

Verwirrung mit Arrays

Beitrag 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.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Verwirrung mit Arrays

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Verwirrung mit Arrays

Beitrag 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;
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Kai78
Beiträge: 3
Registriert: 31. August 2013 20:56

Re: Verwirrung mit Arrays

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Verwirrung mit Arrays

Beitrag von Christian81 »

Viele Wege führen nach Rom würde ich sagen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Kai78
Beiträge: 3
Registriert: 31. August 2013 20:56

Re: Verwirrung mit Arrays

Beitrag von Kai78 »

hehe ja schon aber welcher ist der kürzeste in solch einem Fall.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Verwirrung mit Arrays

Beitrag 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 ...
Antworten