2014-07-25 2 views
2

여기 내 중첩 된 클래스 에 직면하고있는 "체스 ++"문제입니다. 농담처럼 보일 수도 있지만 농담이 아니라 진짜 문제입니다. 내 프로젝트에서 동일한 것을 달성하는 방법을 해결하거나 변경하십시오.* std :: shared_ptr로 사용 *

여기서 원하는 것은 신호를내는 것입니다. 신호는 shared_ptr을 인수로 취하는 핸들러를 트리거하는 것으로 선언됩니다. notify() 함수는 * this를 shared_ptr로 변환해야합니다. 위의 코드를 실행하려면 어떻게해야합니까? enable_shared_from_this에서

+3

std :: shared_from_this – Sneftel

+0

가능한 중복 [boost :: shared \ _ptr 받기] (http://stackoverflow.com/questions/142391/getting-a-boostshared-ptr-for-this) – Sneftel

+0

[ 함수에 대한 참조] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this) (클래스가 해당 클래스에서 상속해야 함을 유의하십시오.) – chris

답변

3

파생 :

struct bar : std::enable_shared_from_this<bar> 

가 회원 shared_from_this() 얻을 :

some_signal.emit(shared_from_this()); 

만큼 현재의 객체가 적어도 하나의 공유 포인터가 소유하고,이 공유 포인터를 반환됩니다, 해당 포인터와 소유권을 공유합니다. 프로그램에서 a_foo_bar이 비어 있으므로 notify에 대한 호출도이 기능도 작동하지 않습니다. 또한 객체가 그 시점에 공유 포인터에 의해 소유되어 있지 않으므로 생성자 또는 소멸자에서 작동하지 않습니다.

+1

현재 오브젝트가 소유되지 * 않은 * 경우 'shared_ptr'에 의해,'shared_from_this()'는 * throw *됩니다. 따라서'bar'의 생성자를 숨기고'std :: shared_ptr '을 반환하는 정적 팩토리 메소드를 노출하는 것이 좋습니다. 그러면 모든 인스턴스가'shared_ptr'에 있음을 보장 할 수 있습니다. – dlf

+1

@dlf : 그보다 나쁘다 : 공유 포인터가 소유하지 않은 경우 정의되지 않은 동작이 발생합니다. (표준에서 주어진 예제 구현은 약한 포인터를 저장하면'bad_weak_ptr'을 던질 것이지만, 그 구현을 사용할 필요는 없다). –