2010-04-27 32 views
11

Cho phép nói rằng tôi có một lớp trừu tượng Cát có một vài lớp con trừu tượng là Wildcat, Housecat, v.v.Cách tạo mảng động của lớp Tóm tắt?

Tôi muốn mảng của mình có thể lưu trữ con trỏ tới một loại mèo mà không biết loại đó thực sự là gì.

Khi tôi cố gắng phân bổ động mảng Cát, nó có vẻ không hoạt động.

Cat* catArray = new Cat[200]; 

Trả lời

17

Bằng cách tạo một aray của con trỏ đến Cát, như trong

Cat** catArray = new Cat*[200]; 

Bây giờ bạn có thể đặt Wildcat của bạn, HouseCat vv trường tại các địa điểm khác nhau trong mảng ví dụ

catArray[0] = new WildCat(); 
catArray[1] = new HouseCat(); 
catArray[0]->catchMice(); 
catArray[1]->catchMice(); 

Couple số khó khăn , khi thực hiện
a) Đừng quên xóa các phiên bản được phân bổ trong catArray như trong xóa catArray [0], v.v.
b) Đừng quên xóa bản thân catArray bằng cách sử dụng

delete [] catArray; 

Bạn cũng nên xem xét sử dụng vector để tự động hóa b) cho bạn

6

Bạn sẽ cần phải tạo một mảng các con trỏ để Cat:

Cat** catArray = new Cat*[200]; 

Thậm chí nếu các lớp cơ sở Cat là bê tông, bạn sẽ vẫn chạy ầm ầm trong object slicing nếu bạn đã tạo một mảng của Cat.

Lưu ý rằng bạn có thể sử dụng một số std::vector thay vì một mảng và có thể sử dụng con trỏ thông minh để đảm bảo mã của bạn là ngoại lệ an toàn.

0

Bạn không thể trực tiếp khởi tạo một thể hiện của lớp trừu tượng, nhưng thay vào đó phải khởi tạo một cá thể của một lớp con được triển khai đầy đủ.

Vì vậy, đây là hợp pháp:

Housecat* theCats = new Housecat[200]; 

và sau đó bạn có thể truy cập mỗi con mèo thông qua giao diện Cát

bool catsMeow = ((Cat*)(&theCats[0]))->CanMeow(); 

Nhưng trình biên dịch không có cách nào biết làm thế nào để nhanh chóng một lớp trừu tượng; trên thực tế, thực tế là nó trừu tượng có nghĩa là nó không thể được khởi tạo trực tiếp.

Tại sao thực hiện việc này? Vì Mèo sẽ có phương thức trừu tượng

bool CanMeow() = 0; 

Tất cả những con mèo thừa kế đều phải thực hiện. Sau đó, bạn có thể hỏi nếu nó có thể meo meo, với cơ hội mà một trường hợp của Lion sẽ trở lại sai.

4

Bạn không thể làm tròn những con mèo trong lồng kích thước cố định, bởi vì trình biên dịch không có cách nào biết được con mèo lớn như thế nào, cũng không phải (thất bại ẩn dụ) cách khởi tạo chúng. Bạn sẽ cần phải làm một cái gì đó như khởi tạo các mảng để null con trỏ mèo hoặc một cái gì đó, và đàn sau này.

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