2010-01-19 10 views
2

나는 게임과 동행 엔진을 C++로 쓴다. 엔진은 간단한 임베디드 스크립팅 언어를 사용하여 자동화에 크게 의존합니다. 스크립트는 객체 클래스를 만들고, 이벤트 리스너를 정의하고, 인스턴스 리스너를 생성 할 수 있습니다. 현재 인스턴스를 유지하려면 스크립트 전역 식별자에 인스턴스를 바인딩해야합니다. 분명한 결과는 익명의 객체가 존재할 수 없다는 것입니다.std :: set 유지하기 <boost :: shared_ptr>

현재 인스턴스는 std::set<Instance*, spatial_sort>을 사용하여 관리됩니다. 여기에서 spatial_sort은 렌더링 및 충돌 감지를 위해 인스턴스를 위치별로 정렬하는 Functor입니다. 인스턴스는 50 분의 1 초 안에 전체적으로 움직이지 않을 것이라는 가정하에 힌트로 현재 위치를 사용하여 각 프레임을 제거하고 다시 삽입합니다. 인스턴스에 dead 플래그가 설정되어 있으면 해당 세트에서 지워집니다. Instance 생성자 및 소멸자는 각각 insert(this)erase(this)을 호출합니다.

익명 인스턴스를 허용하기 위해 std::set<boost::shared_ptr<Instance>, spatial_sort>으로 설정을 변경하여 Instance이 인스턴스 소유권을 공유하고 인스턴스가 파괴 될 때까지 해당 인스턴스를 보존 할 수있게하려고합니다. 아쉽게도 insert()에 대한 호출을 생성자에 배치해야하기 때문에 shared_from_this()shared_ptrInstance으로 가져 오기 위해 작동하지 않습니다. Instance은 기본 클래스를 통해 boost::enable_shared_from_this<>에서 이미 상속받습니다.

누군가 적절한 해결 방법을 권장 할 수 있습니까?

편집 : InstanceReference : 내가 처음에 일을하고, 2 개 개의 클래스로 Instance 클래스의 동작을 분할해야 무엇을했다

. 스크립트에서 new SomeClass이라는 표현식은 Reference을 새 Instance으로 반환합니다. Instance 개체 자체는 shared_ptr을 사용하여 관리되지 않으므로 적절한 이벤트 (예 : 애니메이션 끝, 종료, 종료 등)에 대한 응답으로 자살 할 책임이 있습니다.

감사합니다. 리펙토링은 단지 작동하는 경우만큼 좋은 솔루션입니다.

답변

2

당신은 당신이 다음 새 개체를 만드는 데 사용 Instance에 정적 메서드를 추가 할 수 있습니다 그리고 또한 세트에 추가 같은 관리 물건을 수행합니다

static Instance* create(int something) { 
    boost::shared_ptr<Instance> sptr(new Instance(something)); 
    instanceset.insert(sptr); 
    return sptr.get(); 
} 

이 유일한 방법 확인하려면 이 클래스의 객체를 만들려면 일반 생성자를 private 또는 protected로 만들 수도 있습니다.

자세한 내용은 직접 관련이 없지만 생성자에서 가상 함수 사용에 대한 제한을 해결하기 위해 동일한 기술을 사용하는 C++ FAQ Lite 항목 about "Dynamic binding during initialization"도 참조하십시오.

+3

아직은 원시 대신 shared_ptr을 반환하십시오. – rlbond

+0

지금이 솔루션을 사용하고 있습니다. 기본적으로 create()는 익명 인스턴스를 생성하기 위해서만 호출되며, "anonymous"플래그가 설정된 인스턴스를 초기화합니다. 이 플래그가 설정되어 있지 않으면 인스턴스는 기본적으로 null deleter로 자체에 대한 shared_ptr의 insert()를 수행합니다. 현재 나는 변화로 인한 신비한 bad_weak_ptr 예외를 추적하려고 노력하고있다. –

+0

* "이 플래그가 설정되어 있지 않으면 기본적으로 인스턴스가 shared_ptr의 insert()를 수행합니다."* 정확하게 무엇을하는지 확신 할 수는 없지만 문제가 발생하면 다시 실행되는 것처럼 들립니다. 생성하는 동안'shared_from_this()'를 호출 할 수 없습니다. 'shared_from_this()'는 객체가 실제로 shared_ptr에 어딘가에 저장되어있는 경우에만 작동합니다. 예를 들어, 정적으로 할당 된 인스턴스의'shared_from_this()'는 작동하지 않습니다. – sth

관련 문제