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];
}
War es hilfreich?

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];

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top