Tôi đang học C, chủ yếu là bởi K & R, nhưng bây giờ tôi đã tìm thấy hướng dẫn về hướng đối tượng C pdf và bị mê hoặc. Tôi sẽ trải qua nó, nhưng kỹ năng/kiến thức C của tôi có thể không liên quan đến nhiệm vụ. Đây là hướng dẫn: http://www.planetpdf.com/codecuts/pdfs/ooc.pdfCon trỏ không có dấu vết cho các con trỏ cấu trúc trong C
Câu hỏi của tôi xuất phát từ việc xem xét nhiều chức năng khác nhau trong vài chương đầu của pdf. Dưới đây là một trong số họ. (trang 14 của pdf)
void delete(void * self){
const struct Class ** cp = self;
if (self&&*cp&&(*cp)->dtor)
self = (*cp)->dtor(self);
free(self);
}
dtor là một con trỏ hàm hủy. Nhưng kiến thức về điều này không thực sự cần thiết cho câu hỏi của tôi.
- Câu hỏi đầu tiên của tôi là tại sao hằng số ** cp? Là nó cần thiết hoặc chỉ được toàn diện để các nhà văn mã không làm bất cứ điều gì gây tổn hại do tai nạn?
- Thứ hai, tại sao cp là con trỏ trỏ đến con trỏ (dấu hoa thị kép?). Lớp struct được định nghĩa ở trang 12 của pdf. Tôi không hiểu tại sao nó không thể là một con trỏ duy nhất, vì chúng tôi đang đúc con trỏ tự đến một con trỏ lớp, có vẻ như.
- Thứ ba, làm thế nào là một con trỏ void được thay đổi thành một con trỏ Class (hoặc con trỏ trỏ đến một lớp-con trỏ)? Tôi nghĩ câu hỏi này cho thấy sự thiếu hiểu biết của tôi về C. Những gì tôi tưởng tượng trong đầu của tôi là một con trỏ void chiếm một lượng bộ nhớ, nhưng nó phải nhỏ hơn con trỏ Class, bởi vì một Class có rất nhiều "thứ" trong đó. Tôi biết một con trỏ void có thể được "đúc" để một loại con trỏ, nhưng tôi không hiểu làm thế nào, vì có thể không có đủ bộ nhớ để thực hiện điều này.
Cảm ơn trước
@Joe Hoàn toàn không có gì sai với điều đó. Kỹ năng lập trình C tốt rất có giá trị và khó có thể tìm thấy những ngày này của các bản viết nhanh. – jman
@ Joe - Tôi cho rằng nó có nghĩa là ANSI C89, cuốn sách K & R mới hơn được thảo luận. mã trong ví dụ không phải là K & R C IIRC. – Flexo
Tôi đang đọc K & R ANSI (Tôi nghĩ từ năm 1989, như bạn đã nêu.) Ví dụ mã có dạng pdf OOC –