Vì nó được hiểu không đúng, tôi phải làm rõ. Tất cả các giải pháp sau không yêu cầu bạn phải biên dịch lại đối tượng. Để sử dụng một lớp trong mã của bạn, nếu nó được biên dịch thành một tệp đối tượng, bạn nên bao gồm tệp tiêu đề có khai báo của lớp đó.
#include <class.h>
ObjectFoo instance;
Nó là có thể (nhưng nguy hiểm trừ khi bạn cẩn thận) để thay đổi tiêu đề (a) hoặc sao chép các tiêu đề đi nơi khác và bao gồm rằng tiêu đề (b), mà không cần biên dịch lại lớp đó .
#include <class_fixed.h>
ObjectFoo instance;
Mã của bạn, nơi bạn có bao gồm tiêu đề mới sẽ chỉ nghĩ rằng trong tập tin đối tượng (mà bạn đã không biên dịch lại!) Ông sẽ tìm thấy thi của lớp khai báo là trong class_fixed.h
. Trong khi vẫn tồn tại lớp được tuyên bố là trong class.h
. Nếu bạn thay đổi bù đắp của các thành viên (thêm thành viên mới ví dụ) trong tiêu đề mới của bạn, bạn đã chết và mã sẽ không hoạt động đúng. Nhưng chỉ cần thay đổi truy cập hoạt động tốt. Biên dịch mã không biết về truy cập, điều này chỉ quan trọng trong việc biên dịch lạ.
Điều này không phải lúc nào cũng có hại. Trong cuộc sống hàng ngày bạn gặp phải một sự thay đổi khi bạn cài đặt phiên bản mới của một thư viện vào hệ thống của bạn và không biên dịch lại tất cả các chương trình phụ thuộc vào nó. Nhưng nó phải được xử lý cẩn thận
Có một số giải pháp.
memcpy()
Đừng! Không memcpy như sao chép đối tượng đôi khi trải qua chính sách cụ thể áp đặt bởi các nhà thiết kế lớp. Ví dụ: auto_ptr
s không thể chỉ là memcopied: nếu bạn memcopy các auto_ptr
và sau đó destructor được chạy cho cả hai, bạn sẽ cố gắng để giải phóng cùng một bộ nhớ hai lần và chương trình sẽ sụp đổ.
Thay đổi private:
-public:
trong tiêu đề hoặc với vĩ mô
Nếu bạn được phép tạo nó, bạn có thể giải quyết vấn đề của bạn bằng cách chỉnh sửa các tập tin tiêu đề mà đi kèm với việc thực hiện của lớp. Liệu mã nguồn của việc triển khai (tức làcpp-file của lớp) nằm dưới sự kiểm soát của bạn không quan trọng: thay đổi riêng thành công cho các thành viên dữ liệu (tiêu đề) đủ và hoạt động tốt ngay cả khi bạn được cung cấp một thư viện nhị phân chỉ chứa định nghĩa lớp. (Đối với các chức năng thành viên thay đổi truy cập đôi khi thay đổi tên nội bộ của nó, nhưng đối với MSVS và GCC đó là ok.)
Thêm một hàm getter mới
Trong khi thay đổi private
-public
là gần như luôn luôn ok (trừ khi bạn dựa vào cụ thể thời gian biên dịch kiểm tra sẽ phá vỡ trình biên dịch nếu lớp có một số thành viên có thể truy cập được), việc thêm hàm getter mới cần được thực hiện cẩn thận. Hàm getter phải là nội tuyến (và do đó được xác định trong tệp tiêu đề của lớp).
reinterpret_cast
Dàn diễn viên làm việc tốt nếu bạn KHÔNG đúc một con trỏ tới lớp cơ sở năng động (phương tiện năng động "với các chức năng ảo hoặc căn cứ") có ví dụ thực tế tại thời điểm đúc có thể được bắt nguồn từ lớp ở đoạn mã cụ thể.
protected:
Và chỉ trong trường hợp bạn quên. C++ có thể khai báo thành viên protected:
, tức là chỉ có thể truy cập vào các lớp bắt nguồn từ phần đã cho. Điều này có thể đáp ứng nhu cầu của bạn.
Nguồn
2009-10-03 08:23:40
Làm cách nào để chỉnh sửa nguồn? '// private:' sẽ hoạt động tốt;) – LiraNuna
Tôi nghĩ rằng anh ấy muốn giữ cho người dùng lớp học của mình không bị lộn xộn (vì vậy riêng tư) và cần triển khai một cái gì đó không thực sự phù hợp với thiết kế hiện tại. – jdehaan
Tôi nghĩ bạn không có mã, phải không? –