2010-06-11 69 views
6

Tôi thừa hưởng một ứng dụng lớn được viết ban đầu trong C (nhưng trong thời gian đó, rất nhiều C++ cũng được thêm vào nó). Vì lý do lịch sử, ứng dụng chứa rất nhiều con trỏ trống. Trước khi bạn bắt đầu bị nghẹt thở, hãy để tôi giải thích lý do tại sao điều này được thực hiện.Làm thế nào để loại bỏ các con trỏ void

Ứng dụng chứa nhiều cấu trúc dữ liệu khác nhau, nhưng chúng được lưu trữ trong các thùng chứa 'chung'. Ngày nay tôi sẽ sử dụng các container STL templated cho nó, hoặc tôi sẽ cung cấp cho tất cả các cấu trúc dữ liệu một lớp cơ sở chung, để container có thể lưu trữ con trỏ tới lớp cơ sở, nhưng trong C ngày cũ tốt, giải pháp duy nhất là cast struct-pointer đến một con trỏ void.

Bên cạnh đó, có rất nhiều mã mà hoạt động trên những khoảng trống con trỏ, và sử dụng công trình xây dựng C rất lạ để bắt chước đa hình trong C.

Tôi bây giờ làm lại các ứng dụng, và cố gắng để thoát khỏi sự void-con trỏ. Việc thêm một lớp cơ sở chung cho tất cả các cấu trúc dữ liệu không phải là khó (vài ngày làm việc), nhưng vấn đề là mã có đầy đủ các công trình như được hiển thị bên dưới.

Đây là một ví dụ về dữ liệu được lưu trữ như thế nào:

void storeData (int datatype, void *data); // function prototype 
... 
Customer *myCustomer = ...; 
storeData (TYPE_CUSTOMER, myCustomer); 

Đây là một ví dụ về dữ liệu như thế nào là lấy một lần nữa:

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key); 

Tôi thực sự muốn thay thế tất cả các khoảng trống con trỏ với một số thông minh con trỏ (tham chiếu tính), nhưng tôi không thể tìm thấy một thủ thuật để tự động hóa (hoặc ít nhất) giúp tôi để thoát khỏi tất cả các phôi đến và đi từ void-con trỏ.

Bất kỳ mẹo nào về cách tìm, thay thế hoặc tương tác theo bất kỳ cách nào có thể với các chuyển đổi này?

+1

Tôi thực sự tin rằng không có mẹo để làm điều này tự động. Một cái khác ... – INS

+0

Các chức năng lưu trữ và tìm nạp làm gì với 'datatype'? Họ đang làm một bản sao mù của cấu trúc hoặc chỉ lưu trữ con trỏ void đó? –

+0

Kiểu dữ liệu được sử dụng để lưu trữ tất cả dữ liệu cùng loại dữ liệu với nhau và thực hiện một số logic 'phổ biến' trên các kiểu dữ liệu. Như đã nói, nó mô phỏng đa hình trong đồng bằng C. – Patrick

Trả lời

0

Rõ ràng, không có cách thức/thủ thuật tự động nào để chuyển đổi hoặc tìm tất cả việc sử dụng các con trỏ void.Tôi sẽ phải sử dụng lao động thủ công để tìm tất cả các con trỏ void, kết hợp với PC-Lint sẽ gây ra lỗi bất cứ khi nào có một chuyển đổi không chính xác.

Đã đóng trường hợp.

0

Bạn có thể không cần phải loại bỏ các phôi để sử dụng các con trỏ được chia sẻ.

storeData(TYPE_CUSTOMER, myCustomer1->get()); 

shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???"); 

Tất nhiên, điều này giả định rằng bạn không muốn chia sẻ cùng một con trỏ trên các lệnh gọi để lưu trữ/tìm nạp. Nói cách khác, myCustomer1 và myCustomer2 không chia sẻ cùng một con trỏ.

7

Tôi thực sự muốn thay thế tất cả các khoảng trống -con trỏ với một số thông minh-con trỏ (tài liệu tham khảo-tính), nhưng tôi không thể tìm thấy một thủ thuật để tự động hóa (hoặc ít nhất) giúp tôi để có được loại bỏ tất cả các phôi đến và khỏi các con trỏ không hoạt động.

Việc tái cấu trúc tự động như vậy mang lại nhiều rủi ro.

Nếu không, đôi khi tôi thích chơi các thủ thuật bằng cách tạo ra khoảng trống * hoạt động chức năng mẫu. Đó là:

void storeData (int datatype, void *data); 

trở thành:

template <class T> 
void storeData (int datatype, T *data); 

Lúc đầu thực hiện mẫu bằng cách đơn giản gói bản gốc function (đổi tên) và chuyển đổi các loại. Điều đó có thể cho phép bạn xem các vấn đề tiềm ẩn - đã đơn giản bằng cách biên dịch mã.

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