2009-03-05 16 views
5

Gibt es eine Möglichkeit, die Größe eines Arrays bis zu einer Klassenmethode oder einem Konstruktor zu verzögern?Verzögern der Array-Größe in der Klassendefinition in C++?

Was ich denke an so etwas wie dies aussehen könnte, die (natürlich) nicht funktioniert:

class Test 
{ 
    private: 
    int _array[][]; 

    public: 
    Test::Test(int width, int height); 
}; 

Test::Test(int width, int height) 
{ 
    _array[width][height]; 
} 

Antwort

8

Worüber Daniel spricht ist, dass Sie Speicher für Ihr Array dynamisch reservieren müssen, wenn Ihre Test (Breite, Höhe) -Methode aufgerufen wird.

Sie würden Ihren zweidimensionalen wie folgen aus (unter der Annahme, Array von ganzen Zahlen) erklärt:

int ** _array; 

Und dann in Ihrer Testmethode würden Sie müssen zuerst das Array von Zeigern zuweisen, und dann für jeden Zeiger eines zuteilen Array von ganzen Zahlen:

_array = new *int [height]; 
for (int i = 0; i < height; i++) 
{ 
    _array [i] = new int[width]; 
} 

Und dann, wenn das Objekt freigegeben wird Sie den Speicher explizit löschen Sie zugeordnet werden müssen.

for (int i = 0; i < height; i++) 
{ 
    delete [] _array[i]; 
    _array [i] = NULL; 
} 
delete [] _array; 
_array = NULL; 
+0

kann den Zeiger Array Zuordnung hinzu: _array = new int [Höhe ]; Upvoted für die Bereitstellung der Quelle obwohl! –

+0

Hoppla. Danke Daniel. Ich habe vergessen, das hinzuzufügen :). Prost. – RedBlueThing

+0

Das Problem mit manuall Arrays Management ist die Tatsache, dass Sie müssen Ihre eigenen Kopie Konstruktoren/operator = oder machen Klasse explizit nicht kopierbar, um zukünftige Probleme zu verhindern – Artyom

2

Ich denke, es ist Zeit für Sie ist die neue/löschen Betreiber zu suchen.

sehen, da dies ein mehrdimensionales Array ist, dann werden Sie eine Schleife haben, durch Aufruf ‚neuen‘, wie Sie gehen (und wieder nicht zu vergessen: löschen).

Ich bin mir sicher, dass viele vorschlagen werden, ein eindimensionales Array mit width * height-Elementen zu verwenden.

8

Vektor ist dein bester Freund

class Test 
{ 
    private: 
    vector<vector<int> > _array; 

    public: 
    Test(int width, int height) : 
     _array(width,vector<int>(height,0)) 
    { 
    } 
}; 
+1

Artyom hat absolut Recht. Sparen Sie sich einen ganzen Haufen Schmerzen :). Ich denke jedoch, dass es gut ist, die zugrunde liegenden Prinzipien zu verstehen. – RedBlueThing

+0

In Bezug auf Datenstrukturen sieht es so aus, als ob ein Vektor immer noch strukturell ein Array ist, aber in eine Klasse eingebunden ist. Ja? – slythfox

+0

Ja, die meisten Vektorimplementierungen verwenden Arrays 'hinter den Kulissen', denke ich. Sie können die Array-Operatoren auch verwenden, um einen Vektor zu manipulieren. – gnud

1

(Monate später) eine Vorlage verwenden kann, wie folgt aus:

// array2.c 
// http://www.boost.org/doc/libs/1_39_0/libs/multi_array/doc/user.html 
// is professional, this just shows the principle 

#include <assert.h> 

template<int M, int N> 
class Array2 { 
public: 
    int a[M][N]; // vla, var-len array, on the stack -- works in gcc, C99, but not all 

    int* operator[] (int j) 
    { 
     assert(0 <= j && j < M); 
     return a[j]; 
    } 

}; 

int main(int argc, char* argv[]) 
{ 
    Array2<10, 20> a; 
    for(int j = 0; j < 10; j ++) 
    for(int k = 0; k < 20; k ++) 
     a[j][k] = 0; 

    int* failassert = a[10]; 

} 
Verwandte Themen