Tôi đã thử tính hợp lệ của thông số truy cập private
trong C++. Ở đây đi:C++ Riêng tư có thực sự riêng tư không?
Interface:
// class_A.h
class A
{
public:
void printX();
private:
void actualPrintX();
int x;
};
Thực hiện:
// class_A.cpp
void A::printX()
{
actualPrintX();
}
void A::actualPrintX()
{
std::cout << x:
}
tôi đã xây dựng này vào một thư viện tĩnh (.a/lib). Bây giờ chúng ta có một cặp class_A.h và classA.a (hoặc classA.lib). Tôi đã chỉnh sửa class_A.h và xóa private:
khỏi nó.
Bây giờ trong một classTester.cpp:
#include "class_A.h" // the newly edited header
int main()
{
A a;
a.x = 12; // both G++ and VC++ allowed this!
a.printX(); // allowed, as expected
a.actualPrintX(); // allowed by G++, VC++ gave a unresolved linker error
return 0;
}
Tôi biết rằng sau khi giả mạo tiêu đề của thư viện tất cả các cược đang tắt (Ý tôi là, hệ thống toàn vẹn, vv) Tuy có phương pháp là hacky, đây là thực sự được phép? Có cách nào để chặn điều này không? Hay tôi đang làm gì sai ở đây?
Tôi biết rằng thiết kế Cheshire Cat (Pimpl - private impl. Http://en.wikipedia.org/wiki/Cheshire_Cat_Idiom_%28programming_technique%29) có thể được thực hiện ở đây và các bộ định danh truy cập cũng là các trình biên dịch thời gian biên dịch bởi trình biên dịch . – legends2k
Tại sao bạn không thể xây dựng lại nó? –
@Dominic: Mục đích của tôi là xem điều gì sẽ xảy ra nếu tôi đang cố gắng truy cập các phần riêng tư của một lớp học. – legends2k