C의 클래스 외부에서 Private 클래스 멤버에 액세스
일반적으로 클래스 멤버를 비공개로 유지하여 캡슐화를 유지하는 것이 권장되지만 다음 사항이 있습니다. 클래스 외부에서 접근이 가능한지 궁금할 수 있는 상황. 이러한 접근 방식과 관련된 고유한 위험에도 불구하고 C에서 수행할 수 있는지 살펴보겠습니다.
포인터 오프셋: 순진한 시도
포인터 오프셋을 사용한다고 믿는 사람들도 있습니다. 비공개 클래스 멤버에게 액세스를 제공할 수 있습니다. 그러나 이 방법은 플랫폼에 따라 다르며 오류가 발생하기 쉽습니다. 클래스 레이아웃은 컴파일러와 아키텍처에 따라 다를 수 있기 때문입니다.
템플릿 전문화: 놀라운 트릭
다소 색다른 접근 방식에는 템플릿 멤버 기능을 전문화하는 것이 포함됩니다. 특정 템플릿 멤버 함수를 특수화하면 원래 개발자가 처음에 비공개로 선언한 경우에도 클래스의 비공개 멤버에 효과적으로 액세스할 수 있습니다.
다음 예를 고려하세요.
class safe { int money; public: safe() : money(1000000) {} template <typename T> void backdoor() { // Do some stuff. } };
위 코드에서는 백도어 함수가 템플릿 멤버 함수로 선언되어 있습니다. 클래스 외부에서 돈에 접근하기 위해 이 기능의 특수화를 생성할 수 있습니다:
#include <iostream> class key; template <> void safe::backdoor<key>() { // My specialization. money -= 100000; std::cout << money << "\n"; } int main() { safe s; s.backdoor<key>(); s.backdoor<key>(); }
출력:
900000 800000
이 예에서는 키 템플릿으로 백도어 기능을 특수화하여 인수를 통해 우리는 클래스 외부에서 개인 멤버 돈을 수정할 수 있습니다. 이 기술은 여전히 좋은 방법으로 간주되지 않으며 대부분의 경우 피해야 합니다.
위 내용은 템플릿 전문화를 사용하여 Private C 클래스 멤버에 액세스할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!