2009-03-05 37 views
5

Có cách nào để trì hoãn việc xác định kích thước của mảng cho đến khi một phương thức lớp hoặc hàm tạo không?Kích thước mảng trễ trong định nghĩa lớp trong C++?

Những gì tôi đang nghĩ đến việc có thể trông như thế này, mà (tất nhiên) không hoạt động:

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

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

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

Trả lời

8

Điều Daniel nói đến là bạn sẽ cần phải cấp phát bộ nhớ cho mảng của mình một cách năng động khi phương thức Kiểm tra (chiều rộng, chiều cao) được gọi.

Bạn sẽ tuyên bố của bạn hai chiều như thế này (giả sử mảng các số nguyên):

int ** _array; 

Và sau đó trong phương pháp thử nghiệm của bạn, bạn sẽ cần phải đầu tiên phân bổ các mảng con trỏ, và sau đó cho mỗi con trỏ cấp phát một mảng số nguyên:

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

Sau đó khi đối tượng được giải phóng, bạn sẽ cần xóa bộ nhớ bạn đã cấp rõ ràng.

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

thể thêm việc phân bổ mảng con trỏ: _array = new int [chiều cao ]; Upvoted cho việc cung cấp nguồn mặc dù! –

+0

Rất tiếc. Cảm ơn Daniel. Tôi quên thêm điều đó :). Chúc mừng. – RedBlueThing

+0

Vấn đề với quản lý mảng manuall là thực tế bạn cần tạo bản sao của riêng bạn/nhà điều hành = hoặc làm cho lớp học không thể sao chép được để ngăn chặn các sự cố trong tương lai – Artyom

2

Tôi nghĩ rằng đó là thời gian để bạn có thể tìm kiếm các mới/xóa nhà khai thác.

Thấy đây là một mảng đa chiều, bạn sẽ phải lặp qua gọi 'mới' khi bạn đi (và một lần nữa đừng quên: xóa).

Mặc dù tôi chắc chắn nhiều người sẽ đề xuất sử dụng mảng một chiều với các yếu tố chiều rộng * chiều cao.

8

vector là bạn thân nhất của bạn

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

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

Artyom hoàn toàn đúng. Tiết kiệm cho mình một đống đau đớn :). Tuy nhiên, tôi đoán nó là tốt để hiểu các nguyên tắc cơ bản. – RedBlueThing

+0

Về cấu trúc dữ liệu, có vẻ như một vectơ vẫn là cấu trúc một mảng nhưng được bao bọc thành một lớp. Ừ? – slythfox

+0

Có, hầu hết việc triển khai vector đều sử dụng mảng đằng sau hậu trường 'Tôi nghĩ vậy. Bạn cũng có thể sử dụng toán tử mảng để thao tác vectơ. – gnud

1

(tháng sau) người ta có thể sử dụng các mẫu, như thế này:

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

} 
Các vấn đề liên quan