2014-01-23 4 views
2

나는이 유사한 수준의 설정이 : 당신이 볼 수 있듯이참조 객체 벡터?

class BlimpBase{ 
public: 
    virtual ~BlimpBase(); 

private: 
    virtual void lift()const = 0; 
}; 

class Blimp: protected BlimpBase{ 
    void lift()const; 
}; 

class BlimpCarrier{ 
public: 
    add_blimp(BlimpBase& blimp); 

private: 
    std::vector<BlimpBase* blimp> blimps; 
}; 

을, 나는 다형성 비행선 클래스 세트를하고 난 (포인터를 사용하여 벡터의 "참조"라고 그때를 저장하기 위해 노력하고 있어요 벡터에 참조를 저장할 수 없다는 것을 깨닫기 만하면, 다른 방법을 설명하는 방법을 모르겠습니다. 문제는 이러한 객체의 대부분이 클래스 멤버로서 스택에 할당되지만이 벡터에이를 추가하여 직접 수정할 수 있다는 것입니다 (사본은 사용하지 않습니다). 이러한 객체에 대한 포인터를 유지하는 문제는 BlimpCarrier이 (스택에 있기 때문에) 범위를 벗어나는 경우 매달린 포인터를 갖게된다는 것입니다. std::unique_ptrstd::shared_ptr을 살펴 보았지만 여기서는 사용할 수 없다고 생각합니다 ...

+0

스택에 할당하지 마십시오. –

+0

@ PaulGriffiths : 이들은 클래스의 멤버이며이 배열을 통해 클래스를 참조하려고합니다. 나는 그들을 힙에 두는 것이 나를 도울 것이라고 생각하지 않는다. – Shokwav

+0

shared_ptr로 클래스에 넣고 shared_ptr 또는 weak_ptr을 통해 벡터에서 참조하면 도움이된다. –

답변

0

스택에 할당 된 위치 또는 구성원으로 지정된 클래스를 변경할 수 있다고 가정하면 시도해 볼 수 있습니다 표준 : : weak_ptr를 가진이 :

class BlimpCarrier{ 
public: 
    add_blimp(std::shared_ptr<BlimpBase>& blimp_ptr) 
    { 
     blimps.push_back(blimp_ptr); 
    } 

private: 
    std::vector<std::weak_ptr<BlimpBase>> blimps; 
}; 

BlimpCarrier globalCarrier; 

void foo() 
{ 
    std::shared_ptr<BlimpBase> instance(new BlimpSubClass()); 
    globalCarrier.add_blimp(instance); 
} 

당신은 추가 단계를 필요로하는 당신이 weak_ptr 객체가 "만료"또는되지 않은 것을 확인하고 벡터에서 그들에게 자신을 제거 벡터를 통과 할 때. 사실은 std::list 대신이 유형의 링크 된 목록 구현을 사용하는 것이 좋습니다. weak_ptr을 정확하고 안전하게 사용하는 좋은 예는 cppreference.com을 참조하십시오.

+1

추가 단계를 위해'std :: remove_if'와'.erase'를 사용하십시오. – Griwes