class A {
public:
A();
int get();
void set();
};
protected int A::var;
작동하는 것처럼 보입니다. 그러나 "보호되지 않은 ID는 보호되기 전에 기대합니다". 이 작업을 수행하는 올바른 방법은 무엇입니까?클래스 외부에서 C++ 보호 변수를 선언 할 수있는 방법이 있습니까?
class A {
public:
A();
int get();
void set();
};
protected int A::var;
작동하는 것처럼 보입니다. 그러나 "보호되지 않은 ID는 보호되기 전에 기대합니다". 이 작업을 수행하는 올바른 방법은 무엇입니까?클래스 외부에서 C++ 보호 변수를 선언 할 수있는 방법이 있습니까?
클래스의 인스턴스에 할당 할 공간을 컴파일러가 어떻게 알 수 있습니까? 이 foo
를 할당 할 때
A foo;
protected int A::var;
A bar;
어떻게 컴파일러는 var
을위한 공간을 할당하는 알 것 고려? 첫 번째와 두 번째 줄은 다른 번역 단위 일 수도 있습니다.
아니, 불가능하지 않기 때문에 불가능합니다.
간단히 말해서, 불가능합니다.
복잡한 단어로, 표준에서는 키워드 및 액세스 지정자 protected
을 클래스 정의 내에서만 사용할 수 있기 때문에 가능하지 않습니다.
가 할 수있는 방법은 없습니다 정확히 당신이 원하는 무엇을 (다른 사람이 말했듯이),하지만 당신은 당신의 클래스의 사용자에게 protected
/private
멤버를 공개하지 않으려면이 주위에 "해킹"이 있습니다. PrivateBase
및 PublicBase
클래스를 만든 다음 두 개의 이전 클래스의 다중 상속 또는 구성을 사용하는 세 번째 클래스를 만들 수 있습니다. 일반적으로 헤더 파일을 배포하려고하지만 모든 비공개 멤버를 공개하고 싶지 않기 때문에이 작업이 수행됩니다.
Here is an example 등이있다. Scott Meyers도 자신의 저서 중 하나에 모범을 보였습니다. 그것은 훨씬 더 많은 작업이며 훨씬 더 복잡한 유지 보수를 목적으로합니다.
+1 좋은 점. – greg