나는 정말로 이해하지 못하는 것에 빠지면서 shared_ptr 's와 enable_shared_from_this를 사용하여 조금 놀고 있었다.std :: enable_shared_from_this; public 대 private
class shared_test : std::enable_shared_from_this<shared_test> {
public:
void print(bool recursive) {
if (recursive) {
shared_from_this()->print(false);
}
std::cout << "printing" << std::endl;
}
};
이 클래스는 표준을 확장하고 있습니다 : 개인적으로 enable_shared_from_this : 내 첫 번째 시도에서
나는 이런 식으로 뭔가를 건설했다. 이것은 분명히 다음과 같이 실행하기 때문에 많은 차이를 만듭니다 :
int main() {
auto t(std::make_shared<shared_test>());
t->print(true);
return 0;
}
은 bad_weak_ptr 예외를 throw합니다. 클래스 정의를 std :: enable_shared_from_this에서 공개적으로 공개하는 것처럼 여기는 그냥 find를 실행합니다.
왜 그런가, 내가 여기서 무엇을 놓칠까요? shared_test 클래스의 '외부 세계'는 이것이 공유를 가능하게한다는 것을 알 필요가 없기 때문에 개인 상속을 위해 작동하도록하는 방법이 없습니까? (최소한, 당신이 저에게 묻는다면, 또는 다시 무언가를 놓칠 수 있습니까?)
여전히 오류는 개인 액세스 컴파일 오류가 아니라 런타임 오류입니다. 내가 생각할 수있는 다른 모든 경우에는, 레이아웃, 결단, ...에는 아무런 차이가 없다. 액세스 제어는 #define private public이 동일한 오브젝트 파일을 제공하는 지점까지 마지막으로 독립적으로 수행됩니다. –
@JohanLundberg '외부 세계'에는 개인 상속과 상속이 (논리적 인) 차이가 없습니다. private 상속은'is_base_of, shared_test>'가 거짓이라는 것을 의미한다. 이것은 shared_ptr 생성자가 생성 한 코드를 제어하는 컴파일 타임 테스트이다. –
Oktalist
@Oktalist. 고마워요 - 따라와. 내 의견에 쓴 것은 분명히 상속을위한 것이 아닙니다. –