나는 다음과 같은 계층 구조 한 : 이제설계 및 데이터의 초기화
Base_class
|
Traits_class
|
Concrete_class
는 것은 데이터에 포함되는 Base_class
은 (는 Traits_class
가 액세스 권한을 가지고 있기 때문에 거기에있을 필요가있는 그것. Traits_class
전달 된 템플릿 매개 변수에 따라 다른 기능을 클래스 템플릿 (그래서 나는 다른 클래스에 대한 부분 템플릿 특수화를 사용합니다.) 마지막으로, 가장 낮은 수준에서 Concrete_class
또한 클래스 템플릿입니다. 나는 Concrete_class
인스턴스를 만듭니다 only.
이제 질문은 : 모든 생성자와 소멸자를 작성했으며 Concrete_class
내에 이동 의미를 제공했습니다. 즉, 기본 생성자를 호출하지 않지만 파생 클래스에서 직접 상태를 초기화합니다. 이 문제가 있으면 누군가가 지적 할 수 있습니까? 소멸자 만이 Base_class
에 선언되고 보호 된 것으로 선언됩니다. 이 디자인에 결함이 있습니까?
통찰력을 가져 주셔서 감사합니다. 편집
그래서 나는 CRTP에 Yakk의 코멘트 다음 디자인을 수정, 지금은 나 또한 내가 할 수있는 CRTP에 모든 Concrete_class
데이터, 감사를 이동 한
Traits_class
|
Concrete_class
이 Traits_class
에서 액세스 할 수 있습니다. 이상한 일이 있었는데 Traits_class
의 생성자 내에서 Traits_class
의 데이터에 액세스 할 수 없었기 때문에 이상한 일이 발생했습니다. 내 말은, 나는 그것에 접근했는데, 나는 마치 Traits_class
(그리고 심지어는 Traits_class
생성자 내에서 인쇄 된) 멤버들을 초기화했기 때문에 고스트 데이터에 액세스하는 것처럼 보였지만, 그 다음에 클래스는 비어 있었다. 그래서 나는 실제로 무슨 일이 일어 났는지 이해하지 못한다. (나는 Traits_class를 Concrete_class에 const_casting하여 이것을 수행했다.)
결국 나는 Traits_class
에 정적 멤버 함수를 작성하여 Concrete_class
의 멤버를 초기화했습니다. 나는 보호 된 멤버 함수를 사용하여 같은 일을 할 수 있었을 것이라고 생각한다. (왜냐하면 나는 Traits_class
을 상속 받았기 때문이다.) 그러나 나는 똑같은 것이라고 생각한다.
추가 의견이 있으시면 알려 주시기 바랍니다. C++ 지혜에 다시 한 번 감사드립니다.
aa
"기본 생성자를 호출하지 않습니다."- 나는 그렇게 생각합니다. 파생 클래스 생성자의 이니셜 라이저 목록에서 호출 할 생성자에 대해 언급하지 않으면 빈 기본 생성자를 호출합니다. CRTP는 파생 클래스의 데이터에'Traits_class' 접근을 허용 할 수 있습니다. – Yakk
내 게시물에 회신 해 주신 Yakk에게 감사드립니다. CRTP에 익숙하지만 파생 클래스에 대한 참조를 저장해야합니다. 맞습니까? 아니면 다른 방법으로 데이터에 액세스 할 수 있습니까? – aaragon
'템플릿 구조체 CRTP_example {D * self() {return static_cast (this); D const * self() const {return static_cast (this); } int getx() const {return self() -> x; }}; 구조체 파생 된 : CRTP_example {int x; 파생 된() : x (7) {}};'- 관련 참조 저장이 없습니다. 'CRTP_example '도'D'의 기본 클래스 인'static_assert'를 원할 것입니다. –
Yakk