Я пытался проверить действительность спецификации private
на C++. Здесь идет:C++ Является ли частный действительно приватным?
Интерфейс:
// class_A.h
class A
{
public:
void printX();
private:
void actualPrintX();
int x;
};
Реализация:
// class_A.cpp
void A::printX()
{
actualPrintX();
}
void A::actualPrintX()
{
std::cout << x:
}
Я построил это для статической библиотеки (.a/.lib). Теперь мы имеем пару class_A.h и classA.a (или classA.lib). Я отредактировал class_A.h и удалил из него private:
.
Теперь в другом 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;
}
Я знаю, что после вмешательства заголовка библиотеки все ставки выключены (я имею в виду, целостность системы и т.д.) Albeit метода является Hacky, это действительно позволил? Есть ли способ заблокировать это? Или я делаю что-то не так?
Я знаю, что здесь возможен дизайн Cheshire Cat (Pimpl - private impl. Http://en.wikipedia.org/wiki/Cheshire_Cat_Idiom_%28programming_technique%29), а также что спецификаторы доступа являются компиляторами времени компиляции , – legends2k
Почему бы вам просто не перестроить его? –
@ Dominic: Мое намерение состояло в том, чтобы увидеть, что произойдет, если я пытаюсь получить доступ к частным частям класса. – legends2k