Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.10.2014, 15:10

Heap, Classen initialisieren.

Kann ich Heap Classen initialisieren?
Folgendes Beispiel: Angenommen
Classen sind definiert und Konstruktor, sowie Dekonstruktor auch.


CodeBeispiel ab int main();

int main()
{
int iZahl = 0;
cin >> iZahl;
CMeineClass *pPointer;
pPointer = new CMeineClass[iZahl](iZahl);
}

Konstruktor wäre dann CMeineClass(int iZahl);

Das funktioniert so natürlich nicht. Ich möchte aber gerne der Classe die iZahl übergeben. Gibt es da eine Möglichkeit?
Ich entschuldige mich schon mal im voraus, wenn ich hier etwas durcheinander werfe, aber ich stehen noch am Anfang.
Das Programm soll nach einer bestimmten Anzahl von iZahl abbrechen. Ich probiere da so rum.
Man könnte natürlich auch z.B. pPointer = new CMeineClass[iZahl/2]; schreiben aber geht's noch anders? Ich habs noch mit public Variablen versucht, aber mein Kompieler sagt, nicht statische Datenmember dürfen nicht außerhalb von Klassen definiert werden.
Danke.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

21.10.2014, 15:24

Ein paar Kleinigkeiten vorab. Versuch nicht Deutsch und Englisch zu mischen. Weder wenn du normal schreibst noch wenn du programmierst. Entscheide dich möglichst für eine Variante, dann ist es leserlicher und verständlicher. Und so heißt es zum Beispiel auch Klasse und Klassen und nicht Classe und Classen. Class bzw Classes wären die englischen Begriffe dafür.
Weiterhin haben wir hier im Forum Codetags. Oben in der Leiste siehst du ein C++-Symbol. Damit gibts Syntax Highlighting für deinen Code und dadurch wird es noch mal leserlicher. Teste das einfach mal.
Nun zu deinem Problem. Bei dem was du da zeigst brauchst du einen Konstruktor ohne Parameter. Dann kannst du mit

C-/C++-Quelltext

1
2
MySampleClass *pointerOnSampleClass;
pointerOnSampleClass = new MySampleClass[10];

10 Objekte anlegen. Das ist natürlich doof wenn du Werte übergeben möchtest. Hier gibt es jetzt ein paar unschöne Möglichkeiten wie Zeiger auf deine Objekte im Array zu speichern und die einzelnen Objekte selbst von Hand anzulegen. Das macht deinen Code aber unnötig kompliziert.
Bei C++ arbeitest du hinterher eigentlich eher weniger mit klassischen Arrays. Es gibt schon fertige Datentypen die dir das klassische Array besser ersetzen können. In diesem Fall wäre zum Beispiel

C-/C++-Quelltext

1
std::vector
interessant. Am einfachsten kann man wohl sagen handelt es sich hierbei um ein Array ohne feste Größe die am Anfang festgelegt werden muss. Du den Inhalt also beliebig erweitern. Du steckst also neue Instanzen hinein und kannst hierbei immer explizit deinem Konstruktor Werte übergeben. Das ist im Prinzip was du suchst. Mag sein das du so weit noch nicht bist, also lies vielleicht erst mal weiter im Buch und mach die Übungsaufgaben. Das sollte dann noch kommen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

21.10.2014, 15:52

Danke für die Tipps. Die werde ich beim nächsten mal beachten. Ich hab nochmal etwas mit den von dir erwähnten Zeigern versucht, aber bevor ich mich hier aufreibe :fie: , lese ich lieber weiter. Strg + F (vector) sah ganz vielversprechend aus.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

21.10.2014, 16:21

std::vector ist auch das was du hinterher verwenden wirst. Versuch da vielleicht lieber es gleich richtig zu machen. Aber einfach mal um zu zeigen was ich mit den Zeigern auf deine Instanzen meinte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class SampleClass
{
private:
    int someAttribute;
public:
    SampleClass(int importantParameter)
    {
        someAttribute = importantParameter;
    }
};

int main()
{
    SampleClass **myArray; // Zeiger auf Zeiger auf eine SampleClass Instanz. Anders gesagt, Zeiger auf Adresse der Instanz, anders gesagt Adresse einer Variable mit der Adresse auf die Instanz der Klasse
    int arraySize = 12;
    myArray = new SampleClass[arraySize]; // Hier wird das Array der Größe "arraySize" erstellt. Das Array ist vom Typ Adresse von SampleClass.
    // An dieser Stelle ist zwar das Array korrekt erstellt worden, die Werte sind aber noch nicht sinnvoll. Bis jetzt haben wir ja noch keine Objekte erstellt deren Adresse im Array gespeichert werden können
    for(int i = 0; i < arraySize; i++)
    {
        myArray[i] = new SampleClass(i); // hier erstellen wir die einzelnen Instanzen. Dem Konstruktor übergebe ich als Beispiel einfach i.
        
    }
    
    // Hier ist das Array nun gefüllt
    // wichtig ist, wenn du den Speicher freigeben willst so musst du das erst für die einzelnen Instanzen und dann für das Array selbst tun, also:
    for(int i = 0; i < arraySize; i++)
    {
        delete myArray[i];
    }
    
    delete[] myArray;
    return 0;
}


Werd dir dabei bewusst das ein Array und ein Pointer im Prinzip das selbe sind. Ich weiß nicht ob das in deinem Buch erklärt wird. Ansonsten kannst du danach ja mal googlen oder wir reden hier noch mal darüber. Wie gesagt die hier präsentierte Lösung funktioniert zwar, ist aber dennoch extrem unschön und fehleranfällig. Mit std::vector kannst du da um einiges schöner arbeiten. Hinzu kommt das du später normal nicht direkt mit Zeigern arbeiten wirst sondern eher Smartpointer einsetzt. Das sind Objekte die einen Zeiger verwalten und den Speicher am Ende selbstständig wieder freigeben. Das sind aber wie gesagt weiterführende Themen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

5

21.10.2014, 17:36

Fuer mich ist ein Array nicht das Gleiche wie ein Pointer. Ein Pointer ist einfach eine Zahl. Die Besonderheit dieser Zahl ist das mit ihnen der gesamte Speicher durchnummeriert ist. Und 0 ist reserviert als "ungueltiger Speicher". Wenn an dieser Selle im Speicher ein bestimmtes Objekt liegt, z.b. ein int oder eine Instanz der Klasse Player, so spricht man auch von einem Pointer auf int bzw. Player. Ein Array hingegen ist ein Bereich im Speicher, in dem mehrere gleichartige Objekte direkt hintereinanderliegen. Also z.b. 4 Player Instanzen. Ein Pointer ist daher eine Methode, ein Array im Speicher zu finden (Zahl der erste belegten Speicherzelle des Arrays) und zu strukturieren (bei einem Pointer auf Player liegt das zweite Playerelement sizeof(Player) Bytes weiter "hinten" im Speicher etc.), es beschreibt ein Array aber schon aus dem folgenden Grund nicht vollstaendig, da darin keine Groesse enthalten ist. Im uebertragenen Sinne ist ein Array also sowas wie der Inhalt einiger Seiten in einem Buch und ein Pointer ist nur die Nummer einer Seite.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

21.10.2014, 17:53

Jup. Obwohl eine Variable, die einen Array repräsentiert, technisch nur ein Pointer auf einen Speicherbereich ist, ist der Array an sich natürlich was ganz anderes - nämlich eben genau der erwähnte Speicherbereich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

21.10.2014, 21:09

Außer Zeile 14 - 16 macht das für mich Sinn. Nur zwei Fragen zu deinem Beispiel. [in den Kommentaren]

C-/C++-Quelltext

1
2
3
4
SampleClass **myArray; // Warum zwei Zeiger, da komme ich noch nicht mit!? Aber vieleicht sind meine grundkenntnisse dafür auch noch zu rudimentär.

    int arraySize = 12;
myArray = new SampleClass[arraySize]; // Wird hier der Konstruktor initialisiert oder erst in deiner for Schleife?

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

8

21.10.2014, 21:34

1. Ein Zeiger auf einen Zeiger. Dein Array besteht aus Zeigern auf SampleClass Instanzen auf dem Heap.
Der Zeiger myArray zeigt auf das erste Element (ein Zeiger) des Arrays.

2. Ja, erst in der for-Schleife, weil dort die Objekte erzeugt werden.

9

21.10.2014, 21:56

ja...aaa....so langsam... fangen meine Zahnräder an sich zu drehen. Danke.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

21.10.2014, 22:46

Frage nebenbei: Pointer auf Pointer... befindet sich der zweite Pointer auf dem Stack?

Werbeanzeige