Verzögern der array-Größe in der definition der Klasse in C++?
Frage
Gibt es eine Möglichkeit zur Verzögerung der Festlegung der Größe eines Arrays, bis eine Klasse, Methode oder ein Konstruktor?
Was ich mir denken könnte wie folgt Aussehen, was (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];
}
Lösung
Was Daniel spricht, ist, dass Sie brauchen, um Speicher für das array dynamisch, wenn Sie Ihre Test (Breite, Höhe) - Methode aufgerufen wird.
Sie erklären würde, Ihre zweidimensionalen, wie dies (vorausgesetzt array von ganzen zahlen):
int ** _array;
Und dann in der Test-Methode müssen Sie zuerst allocate array von Zeigern, und dann für jeden Zeiger reservieren Sie ein 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, müssen Sie explizit löschen Sie den Speicher, den Sie zugewiesen ist.
for (int i = 0; i < height; i++)
{
delete [] _array[i];
_array [i] = NULL;
}
delete [] _array;
_array = NULL;
Andere Tipps
vector ist Ihr bester Freund
class Test
{
private:
vector<vector<int> > _array;
public:
Test(int width, int height) :
_array(width,vector<int>(height,0))
{
}
};
Ich denke, es ist Zeit für Sie, um sich die new/delete-Operatoren.
Da dies ist ein mehrdimensionales array, Sie gehen zu müssen, um eine Schleife durch Aufruf von 'neuen', wie Sie gehen (und wieder nicht zu vergessen:löschen).
Obwohl ich bin sicher, viele werden vorschlagen, verwenden Sie ein eindimensionales array mit Breite*Höhe Elementen.
(Monate später) kann man unter Verwendung von Schablonen, wie diesem:
// 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];
}