سؤال

هل هناك طريقة لتأخير تحديد حجم صفيف حتى أسلوب فئة أو منشئ؟

وماذا أنا أفكر في شيء قد تبدو مثل هذه، والتي (بطبيعة الحال) لا يعمل:

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

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

Test::Test(int width, int height)
{
    _array[width][height];
}
هل كانت مفيدة؟

المحلول

وماذا يتحدث دانيال عن هو أنك لن تحتاج إلى تخصيص الذاكرة للمجموعة بشكل حيوي عندما يتم استدعاء الخاص (العرض والارتفاع) طريقة الاختبار.

وأنت ستعلن بك ثنائية الأبعاد مثل هذا (على افتراض مجموعة من الأعداد الصحيحة):

int ** _array;

وبعد ذلك في طريقة الاختبار الخاص بك سوف تحتاج إلى تخصيص أول مجموعة من المؤشرات، وبعد ذلك لكل مؤشر تخصيص مجموعة من الأعداد الصحيحة:

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

وبعد ذلك عندما يتم تحرير الكائن سوف تحتاج إلى صراحة حذف الذاكرة التي خصصت.

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

نصائح أخرى

وناقلات هو أفضل صديق لك

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

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

وأعتقد أنه حان الوقت بالنسبة لك للبحث عن حذف المشغلين الجدد /.

وكما نرى هذه هي مجموعة متعددة الأبعاد، وأنت تسير لدينا لحلقة من خلال الدعوة 'الجديدة' كما تذهب (ومرة أخرى لا ننسى: حذف).

وعلى الرغم من أنني متأكد أن الكثير سوف تشير إلى استخدام مجموعة ذات بعد واحد مع العرض * عناصر الارتفاع.

و(بعد شهرين) يمكن للمرء أن استخدام القوالب، مثل هذا:

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

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top