Tôi vừa thêm một số entry to my blog cho biết cách thực hiện theo cách hoàn toàn phù hợp. Dưới đây là một ví dụ về cách bạn sử dụng nó cho các lớp sau
struct A {
private:
int member;
};
Chỉ cần khai báo một tên thẻ và nhanh chóng một tên cướp giống như ví dụ chương trình sau đây (bài viết của tôi cho thấy việc thực hiện cướp). Sau đó, bạn có thể truy cập thành viên đó bằng cách sử dụng con trỏ thành viên
struct Amem { typedef int type; };
template class rob<Amem, &A::member>;
int main() {
A a;
a.*result<Amem>::ptr = 42; // Doh!
}
Nhưng thực tế, điều này không cho thấy quy tắc truy cập của C++ không đáng tin cậy. Các quy tắc ngôn ngữ được thiết kế để bảo vệ chống lại những sai lầm ngẫu nhiên - nếu bạn cố gắng cướp dữ liệu của một đối tượng, ngôn ngữ theo thiết kế không mất nhiều thời gian để ngăn bạn.
Trên đây là một cách để truy cập thành viên private và được bảo vệ một cách phù hợp. Đây là một cách khác để truy cập được bảo vệ thành viên theo cách phù hợp tiêu chuẩn. Ý tưởng cơ bản là sử dụng con trỏ thành viên
std::deque<int> &getAdapted(std::stack<int> &s) {
struct voyeur : stack<int>
{ using stack<int>::c; };
return s.*(&voyeur::c);
}
int main() {
std::stack<int> s;
std::deque<int> &adapted = getAdapted(s);
output(adapted); // print the stack...
}
Không tham gia hoặc loại tham gia. Phải mất một con trỏ đến một thành viên được bảo vệ của std::stack<int>
thông qua một lớp có nguồn gốc từ nó, nơi mà tên thành viên là công khai, vì vậy trình biên dịch cho phép điều này. Sau đó, nó sử dụng nó trên một đối tượng std::stack<int>
, cũng được cho phép.
Nguồn
2009-06-25 14:59:46
Cụ thể, bạn đang cố gắng thực hiện điều này bằng cách làm điều này? –