2009-03-06 59 views
33

Tôi đang cố gắng tạo một mảng con trỏ. Những con trỏ này sẽ trỏ đến một đối tượng Sinh viên mà tôi đã tạo ra. Tôi phải làm nó như thế nào? Những gì tôi có bây giờ là:Làm cách nào để tạo một mảng con trỏ?

Student * db = new Student[5]; 

Nhưng mỗi phần tử trong mảng mà là đối tượng sinh viên, không phải là một con trỏ đến đối tượng học sinh. Cảm ơn.

Trả lời

68
Student** db = new Student*[5]; 
// To allocate it statically: 
Student* db[5]; 
+1

'Sinh viên * db [5]' giống như 'Sinh viên ** db = new Student * [5]'? Lợi ích của việc sử dụng cái này qua cái kia là gì? – damiancesar

+1

Khi bạn muốn trả về một mảng từ một hàm, mảng cần phải được cấp phát trên heap. Nếu nó được cấp phát trên ngăn xếp, nó sẽ bị phá hủy ngay lập tức khi phạm vi chức năng đó kết thúc. –

17
#include <vector> 
std::vector <Student *> db(5); 
// in use 
db[2] = & someStudent; 

Ưu điểm của việc này là bạn không cần phải lo lắng về việc xóa các lưu trữ được phân bổ - vector nào đó cho bạn.

+0

Trong khi vector là cách được gợi ý để có một danh sách các công cụ, nói đúng, nó không phải là một mảng. –

+0

Nó có thể được sử dụng theo mọi cách mà một mảng có thể được sử dụng. Nếu nó giống như một con vịt, đó là một con vịt. –

+6

Vectơ sẽ tự động xóa lưu trữ được phân bổ, nó sẽ giải phóng bộ nhớ cho _pointers_ nhưng không giải phóng bộ nhớ mà con trỏ trỏ đến. Sử dụng boost :: ptr_vector cho điều đó. –

11

Một mảng của con trỏ được viết như một con trỏ của con trỏ:

Student **db = new Student*[5]; 

Bây giờ vấn đề là, rằng bạn chỉ có thể dự trữ bộ nhớ trong năm con trỏ. Vì vậy, bạn phải lặp qua chúng để tạo ra các đối tượng Sinh viên.

Trong C++, đối với hầu hết các trường hợp sử dụng, cuộc sống dễ dàng hơn với std :: vector.

std::vector<Student*> db; 

Bây giờ bạn có thể sử dụng push_back() để thêm con trỏ mới vào nó và [] để lập chỉ mục con trỏ. Nó là sạch hơn để sử dụng hơn so với điều **.

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