2012-11-23 2 views
1
struct Obj 
{ 
    Obj(P *p, int i): m_p(p), m_info(info) {} 
    std::auto_ptr<P> m_p; 
    int m_info; 
}; 

std::vector<Obj> objects; // error C2558: struct 'Obj' : no copy constructor available... 

문제는 여기 auto_ptr에있는 것 같아요. auto_ptr을 컨테이너에 푸시하는 것은 나쁜 일임을 모두 알고 있으며, auto_ptr을 보유한 사람들을 컨테이너로 푸시하는 것은 좋지 않습니다. 내가 내가 boost::ptr_vector<P> objectsC++ 벡터 잡고 포인터

어떻게 당신이 그것을 분류하는 제안 사용하는 것이 더 m_info 필드 없었다?

+0

왜 'auto_ptr'을 전혀 사용하지 않습니까? 아주 오래된 컴파일러를 사용하고 있습니까? – jalf

+1

'auto_ptr'의 문제점이 무엇인지 모르겠지만 그것을 사용하지는 않았지만'shared_ptr'는 컨테이너에 저장하는 것이 안전합니다. –

+0

아마도 바보 같은 질문 이겠지만 정확히 auto_ptr을 벡터에 넣는 것이 나쁜 이유는 무엇입니까? – Gaminic

답변

0

당신은 원시 자신이 포인터 관리 (소멸자 생성자에서 할당, 할당 해제 및 복사 의미 구현 - RAII와 준수를) 할 수 있습니다처럼 ScopedPointer 클래스를 만들 수 또는 유형을 변경 포인터를 std :: auto_ptr에서 std :: shared_ptr/boost :: shared_ptr/something로 바꾼다.

0

Obj가 p의 소유권을 가지고 있다고 가정합니다. RAII (Obj (P * p, int i)에서 m_p를 할당하고 ~ Obj()에서 삭제)와 함께 일반 포인터를 사용하는 것이 어떨까요?

또는 당신은 쉽게 하나 http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm

+1

원시 포인터 대신 스마트 포인터를 사용하는 것이 좋습니다. 여기의 문제는 특별히 표준 컨테이너와 잘 작동하지 않는'std :: auto_ptr'입니다. – Gorpik

+0

액면 그대로의 조언을하면 실제로 RAII를 따르지 않는 깨진 수업을 작성하게됩니다. 세 가지 규칙에 대해 명시 적으로 언급해야합니다. –

+0

두 분 모두 조언을 구하지 않을 것입니다. 난 원시 포인터를 사용하고 싶지 않아 scoped_ptr는 C++ 표준 라이브러리 컨테이너에서 사용할 수 없습니다. – Nick