attempt to answer another question에서 CRTP 기본 클래스의 자식이 해당 생성자의 매개 변수로 특정 유형을 받아들이도록하는 구성표가 나왔습니다. 매개 변수 유형의 생성자를 private
으로 만들고 CRTP 기본 클래스를 friend
으로 지정하고 선언합니다. 기본 클래스 생성자에 대한 매개 변수로 매개 변수 유형.CRTP 상속의 기본 클래스가 "friending"해도 하위 클래스에도 영향을 줍니까?
template <typename T>
class SingletonBase {
protected: class P { friend class SingletonBase<T>; P() = default; };
public:
SingletonBase(P) {}
};
class Logger: public SingletonBase<Logger> {
using BASE = SingletonBase<Logger>;
public:
Logger() : BASE{P{}} {} // WHY NO ACCESS VIOLATION?
};
:이 방식은 액세스 위반을 통해 원하는 보호를 제공하는 것을 증명하려고 할 때
그러나, 나는 매개 변수 유형의 생성자는 민간에도 불구하고, 자식 클래스를 구축 할 수 있었다 발견 이 compiles without error, 액세스 위반이 예상 되더라도. 왜?
간단히 말해'= default'를 사용하면 "private constructor"트릭에 대한 액세스 지정자 허점을 제공하는 것처럼 들립니다. '= default'에서'{}'*로 바꾸면 클래스 *가 친구가 아닌 다른 사람에 의해 처음부터 만들어 질 수 없습니까? –
@KyleStrand 예. 요점은 사용자 정의 생성자가 아닌 값 초기화의 동작을 변경하지 않는 것이 중요합니다. – songyuanyao
해결책으로 추가한다면 ('friend'이 아닌 클래스가 객체의 인스턴스를 생성하지 못하게하는 것이 목표이기 때문에) 그 대답을 받아 들일 것입니다. –