2014-08-29 4 views
4

의 const와을 보장하기 위해 어떻게 관련 질문 here 물었다. 이제 조금 더 미묘합니다. 여기 복귀 벡터 <unique_ptr>

코드입니다 :

class MyClass { 
    public: 
    const vector<unique_ptr<MyObject> >& get_const_objs() const; 

    private: 
    vector<unique_ptr<MyObject>> m_objs; 
}; 

내 의도는 get_const_objs에서 반환 된 벡터()가 호출 여전히 수 읽기 전용,하지만 벡터의 요소에서 const되지 않기 때문에 문제가 그렇게된다는 것이다 개별 요소를 변경하십시오.

const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs(); 
unique_ptr<MyObject> p = move(objs[0]); 

내 솔루션은 벡터에 const를 삽입하는 것입니다

const vector<const unique_ptr<MyObject> >& get_const_objs() const; 

하지만이 나는 새로운 벡터 각 요소를 복사 get_const_objs()의 지루한 구현에 이르게 :

const vector<const unique_ptr<MyObjects>>& MyClass::get_const_objs() const 
{ 
    vector<const unique_ptr<MyObjects>> ret; 
    for (const auto &obj : my_objs) { 
    ret.push_back(obj); 
    } 
    return ret; 
} 

예, 나는 MyClass에에 반복자 인터페이스를 추가 할 수 있습니다. 다른 해결책이 있습니까?

나는 제한이 있습니다 BOOST 사용할 수 없습니다. 하지만 실제로 표준을 사용하는 것이 좋으면 BOOST 솔루션을 알고 싶습니다.

+4

. 그리고'unique_ptr p = move (objs [0]);'가 컴파일되지 않습니다. – chris

+0

질문을 올바르게 이해하면 '벡터'가 보유한 객체가 변경되지 않도록하는 방법을 찾으려합니다. 그렇다면 제목이 약간 잘못된 것입니다. –

+0

이미 벡터 내부의 요소를 해당 벡터에 대한 const 참조를 통해 수정할 수 없습니다. 포인터가 가리키고있는 MyObject의 수정을 막는 방법에 대해 이야기하고 있습니까? –

답변

1
const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs(); 
unique_ptr<MyObject> p = move(objs[0]); 

You cannot do it 그래서 걱정할 필요가 없습니다.

objsconst vector<> &이므로이 벡터의 요소도 const으로 처리됩니다. 그러므로, 당신은 그것을 "움직일"수 없습니다; const 개체를 이동할 수 있습니까?

+1

예, 당신 말이 맞아요. 코드를 실제로 컴파일하지 않아야합니다. 벡터와 그 요소의 constence에 대한 지식을 새로 고침해야합니다. –

0

A (조금) 더 나은 솔루션 std::vector<const MyObject*>을 반환하고 std::unique_ptr을 노출하지 않는 것입니다.

std::vector<const MyObject*> get_const_objs() const 
{ 
    std::vector<const MyObject*> res; 
    res.reserve(my_objs.size()); 
    for (const auto& obj : my_objs) { 
     res.push_back(obj.get()); 
    } 
    return res; 
} 

매번 벡터를 다시 만드는 대신이 벡터를 구성원으로 가질 수 있지만 벡터를 동기화 된 상태로 유지해야합니다.

0

사용자 정의 반복자가 갈 수있는 가장 쉬운 방법이 될 것 같습니다, 단순히 CONST에 역 참조 만 반복자를 노출은

class ConstObjectIter { 
public: 
    ... 
    const MyObject& operator*() const { return **m_it; } 
    const MyObject* operator->() const { return &**this; } 
    ConstIter& operator++() { ++m_it; return *this; } 
    ... 
private: 
    std::vector<std::unique_ptr<MyObject> >::const_iterator m_it, m_end; 
} 

&가 m_objs.begin(), m_objs.end() RESP와 m_it, m_end를 초기화을 MyObject. 벡터의 종류는 요구 사항을 위반으로`const를 T`를 사용