2017-06-03 5 views
3

Ich habe eine Klasse, in der es geschützten Abschnitt ist Ich muss ein Array mit unbekannter Größe deklarieren (die Größe wird dem Konstruktor als Parameter gegeben), also habe ich mich umgesehen und gefunden darauf hin, dass die bestmögliche Lösung ist ein Array von Zeigern zu erklären, jedes Element auf einer ganzen Zahl:Array von Zeigern und Zeiger auf ein Array in C++

int* some_array_; 

und einfach im Konstruktor werde ich die „neue“ Operator:

some_array_ = new int[size]; 

und es hat funktioniert, meine Frage ist: kann ich ein Array in einer Klasse deklarieren ohne das si zu definieren ze? und wenn ja, wie mache ich das, wenn nicht, warum funktioniert es dann für Zeiger und nicht für ein normales Array?

EDIT: Ich weiß vecotrs das Problem zu lösen, aber ich kann sie nicht auf meiner HW verwenden

+0

Wahrscheinlich möchten Sie keine geschützten Daten - es ist fast immer eine schlechte Idee. Und verwenden Sie std :: vector, nicht ein explizit dynamisch zugeordnetes Array. –

+1

Es gibt 2 Möglichkeiten, ein Array zu definieren ... 1. Mit einer Größe, die Sie beim Kompilieren von Int Name [10] definieren, befindet es sich auf dem Stack ... Dort brauchen Sie den Löschbefehl nicht, da er automatisch gelöscht wird wenn du aus dem Raum gehst. 2. Ein dynamisches Array int * Name = new int [n], dann ist es auf dem Heap. So bleibt es, bis Sie delete sagen [] Name – Thomas

+1

'some_array_' ist kein Array von Zeigern, es ist ein Zeiger, der auf das erste Element eines Arrays zeigt. Ein Array von Zeigern wäre "int * x [Größe]"; ein Zeiger auf ein Array 'int (* x) [Größe]'. – molbdnilo

Antwort

0

Sie immer einen Vektor verwenden könnte. Um dies zu tun, fügen Sie diese Codezeile: #include <vector> an der Spitze des Codes, und dann den Vektor wie folgt definieren:

vector<int> vectorName;

Denken Sie daran, dass die Vektoren sind nicht Arrays und sollte nicht behandelt werden so wie. In einer Schleife möchten Sie beispielsweise ein Element eines Vektors wie folgt abrufen: vectorName.at(index) und nicht wie folgt: vectorName[index]

+0

ye ich weiß, Vektoren lösen leicht das Problem, Problem ist, ich kann sie nicht auf meine Aufgabe verwenden :( –

1

Sie müssen darüber nachdenken, wie dies aus der Sicht des Compilers funktioniert. Ein Zeiger verwendet eine bestimmte Menge an Speicherplatz (normalerweise 4 Byte), und Sie fordern mit dem neuen Operator mehr Speicherplatz an. Aber wie viel Platz benötigt ein leeres Array? Es kann nicht 0 Byte sein, und der Compiler kann nicht wissen, welchen Platz für ein Array ohne Elemente zugewiesen werden soll. Daher ist es nicht erlaubt.

0

Nehmen wir an, Sie haben ein Integer-Array der Größe 2. Sie haben also Array [0,1] Arrays sind kontinuierliche Bytes von Memery, also wenn Sie eine deklarieren und dann ein oder mehrere Elemente am Ende hinzufügen möchten von diesem Array hat die genaue nächste Position (in diesem Fall: bei Index 2 (oder der dritten ganzen Zahl)) eine hohe Chance, bereits zugewiesen zu sein, in diesem Fall kann man es einfach nicht tun. Eine Lösung besteht darin, ein neues Array zu erstellen (in diesem Fall 3 Elemente), das ursprüngliche Array in das neue Array zu kopieren und an der letzten Position die neue Ganzzahl hinzuzufügen. Offensichtlich hat dies hohe Kosten, also tun wir es nicht.

Eine Lösung für dieses Problem in C++ ist Vector und in Java sind ArrayLists.