2008-10-15 6 views
32

Có cách nào để ẩn các thành viên dữ liệu cá nhân của lớp C++ khỏi người dùng, trong tệp cpp không? Tôi nghĩ rằng các thành viên tư nhân là một phần của việc thực hiện và có vẻ như một chút ngược lại để khai báo chúng trong tệp tiêu đề.Ẩn các thành viên dữ liệu riêng tư? (C++)

Trả lời

52

Thành ngữ "pimpl" là cách xử lý thông thường.

Xem

+0

Cảm ơn, nó hoạt động ngay bây giờ. Hai bài báo này giải thích thành ngữ tốt. – jeffythedragonslayer

+0

Điều này có bất kỳ tác động hiệu suất nào không? – jjxtra

+0

Nói chung, có điều này có thể có một tác động hiệu suất, như có một dereference con trỏ liên quan bất cứ khi nào các công cụ tư nhân được truy cập. Tuy nhiên, một trình biên dịch có thể tối ưu hóa nó để tác động không đáng kể. –

4

Cách cổ điển để làm điều này là với một con trỏ proxy để một lớp học nội mà thực hiện chức năng. Không có cách nào để làm các định nghĩa lớp một phần trong C++ mà tôi biết.

1

Đi thương mại? ;)

Bạn có thể tạo tệp tiêu đề, trong đó bạn chỉ khai báo API công khai và được bảo vệ.

Người dùng chỉ được trình bày với những thứ này mà họ có thể đưa vào. Chúng liên kết mã của chúng với thư viện mà bạn đã xây dựng bằng cách sử dụng API hoàn chỉnh và các định nghĩa.

Đối với các chức năng nội tuyến: đảm bảo chúng được sử dụng trong mã không có nội tuyến, sau đó sẽ có định nghĩa trong thư viện (tuy nhiên, tôi không chắc chắn nó sẽ được đưa vào trong triển khai người dùng).

Đối với mã templated, không có cách nào thực sự xung quanh. Một giải pháp nửa vời là tạo mã, sử dụng mã templated với các kiểu đối tượng khác nhau. Người dùng sẽ bị giới hạn bởi vì chúng là những định nghĩa duy nhất có sẵn trong thư viện của bạn.