나는 생성자 내에 다른 자식 객체를 생성하는 객체를 'this'를 전달하여 자식이 포인터를 부모 객체에 다시 저장할 수 있도록합니다. boost :: shared_ptr을 std :: auto_ptr 또는 원시 포인터에 대한 안전한 대안으로 광범위하게 사용합니다. 따라서 자식은 shared_ptr<Parent>
과 같은 코드를 가지며 boost는 부모가 자식에게 줄 수있는 메서드 shared_from_this()
을 제공합니다.생성자에서 'this'포인터를 처리하는 방법은 무엇입니까?
제 생각에는 shared_from_this()
은 생성자에서 사용할 수 없습니다. 왜냐하면 실제로 '범죄'가 아니라 생성자에서 사용할 수 없기 때문에 어쨌든 생성자에서 사용하지 않아야하며 제한을 신경 쓰지 않는 한 .
Google의 C++ 스타일 가이드 states 생성자는 멤버 변수를 초기 값으로 설정하면됩니다. 복잡한 초기화는 명시적인 Init() 메소드에 있어야합니다. 이것은 '생성자에서 this - in - constructor'문제뿐만 아니라 몇 가지 다른 문제를 해결합니다.
귀찮은 것은 여러분의 코드를 사용하는 사람들이 여러분의 객체 중 하나를 만들 때마다 Init()를 호출해야한다는 것입니다. 내가 이것을 시행 할 수있는 유일한 방법은 Init()가 이미 모든 멤버 함수의 최상단에서 호출되었다는 주장을하는 것이지만, 이것은 작성하기가 번거롭고 실행이 번거롭다.
도중에 어떤 단계에서도이 문제를 해결할 수있는 관용구가 있습니까?
Google이 잘못되었습니다. comp.lang.C++에 대한 자신들의 스타일 가이드의이 짧은 설명에 거대한 글이 있습니다. 그들이 (예외적으로) 예외를 금지하기 때문에 이것에 대한 기본적인 이유가 있습니다. –
@Neil : 내가 얻은 인상은 C++을 잘 모르는 사람들, 그들이 할 수있는 피해를 줄이려고 시도하는 것, 레거시 코드로 일관성을 유지하는 사람들을 수용하기 위해 스타일 가이드를 다루는 것이 었습니다. Google은 스타일 가이드에 대한 충분한 이유가있을 수 있지만 다른 사람이 복사 할 수있는 좋은 모델은 아닙니다. –
@David 맞습니다. 그러나 사람들은 부동 소수점 숫자 (주제에 대한 모든 질문을 살펴보십시오) 또는 정수를 사용하여 혼란 스러울 수 있지만 사용을 금지하지는 않습니다. 이것이 스타일 가이드의 팬이 아닌 이유 중 하나입니다. –