Thường theo quy ước, một thành viên riêng có thêm dấu gạch dưới trong tên của nó hoặc một số nội dung như được thêm vào _pri
. Hoặc có thể là một bình luận. Kỹ thuật này không thực hiện kiểm tra được thực thi bởi trình biên dịch để đảm bảo không ai truy cập vào các trường đó một cách không thích hợp, nhưng đóng vai trò cảnh báo cho bất kỳ ai đọc tuyên bố struct
rằng nội dung là chi tiết triển khai và không được nhìn trộm.
Một kỹ thuật phổ biến khác là để lộ cấu trúc của bạn dưới dạng loại không hoàn chỉnh. Ví dụ, trong tập tin tiêu đề của bạn, bạn có thể có:
struct my_struct;
void some_function(struct my_struct *);
Và trong việc thực hiện, hoặc một số tiêu đề nội bộ mà không thể truy cập cho người tiêu dùng của thư viện, bạn có:
struct my_struct
{
/* Members of that struct */
};
Bạn có thể cũng làm các thủ thuật tương tự với con trỏ void, có được truyền tới đúng chỗ trong phần "riêng tư" của mã. Cách tiếp cận này mất một số tính linh hoạt (bạn không thể có một cá thể được cấp phát ngăn xếp của một loại không xác định, ví dụ), nhưng điều đó có thể chấp nhận được.
Nếu bạn muốn có một hỗn hợp của các thành viên tư nhân và công cộng, bạn có thể làm điều tương tự như trên, nhưng lưu trữ con trỏ cấu trúc riêng tư như một thành viên của công chúng và để nó không đầy đủ trong người tiêu dùng công cộng của thư viện .
Mặc dù, điều này giới thiệu một số hướng dẫn, có thể làm giảm hiệu suất. Có một số (thường không cầm tay, nhưng sẽ làm việc trên các trình biên dịch hợp lý) gõ-punning thủ thuật bạn có thể sử dụng quá:
struct public_struct
{
int public_member;
int public_member2;
/* etc.. */
};
struct private_struct
{
struct public_struct base_members;
int private_member1;
int private_member2;
};
void some_function(struct public_struct *obj)
{
/* Hack alert! */
struct private_struct *private = (struct private_struct*)obj;
}
này cũng giả định rằng bạn không thể lưu trữ các đối tượng trên stack hay trong lưu trữ tĩnh hoặc nhận kích thước tại thời gian biên dịch.
Ẩn và đóng gói thông tin có trước OOD. –