2016-09-13 6 views
1

의 수명을 적용 : 분명히 아이가 부모보다 오래 안다음 코드를 고려 부모 개체

class Child { 
    vector<Object>::iterator it; 
} 

class Parent { 
    vector<Object> objects; 

    Child getChild(int idx) { 
     Child ret; 
     ret.it = objects.begin() + idx; 
     return ret; 
    } 
} 

을,하지만 난 그게 Child childThing = getParent().getChild(5) 같은 것을 호출을 시도하는 것이 합리적 일 것으로 예상된다. 이 문제를 어떻게 방지 할 수 있습니까? Parent의 인스턴스를 유지하도록 적용 할 패턴이 있습니까? 가능하다면 그 내용이 꽤 복잡하기 때문에 objects을 복사하고 싶지 않습니다.

+1

개체를 복사하지 않고 자식'ret'를 복사합니다 ... – Jarod42

+0

이 코드의 컨텍스트는 무엇입니까? 'Child :: it'은 반복자 매달림의 약속처럼 보입니다 – wasthishelpful

+0

@ Jarod42'objects'는'Parent'의 벡터입니다. 'Child'를 복사하는 것은 괜찮습니다. 단지 반환 된 자식으로 벡터를 복사하고 싶지는 않습니다 :) – Managarm

답변

1

자녀를 부모의 일원으로두면 (특히 자녀에 대한 언급을 전달하고 다른 곳에 저장하지 않는 경우) 도움이됩니다. 원리는 간단합니다 : 자녀는 부모 안에 건설되며 부모가 될 때까지 파괴되지 않습니다.

개체를 복사하는 경우 참조 또는 포인터를 항상 나눠 줄 수 있습니다. 거기에 상당한 벌금이 부과되지 않습니다.

다른 순서로는 컨테이너의 내용이 변경되면 반복자를 쉽게 무효화 할 수 있으므로주의해야합니다.

편집 : 댓글을 올린 후 shared_ptr을 사용하여 부모 개체를 참조 할 수 있습니다. 적어도 부모가있는 동안 부모는 살아있을 것입니다. std :: shared_ptr은 참조 카운트되며 관리되지 않는 일반 포인터보다 약간의 오버 헤드가 있습니다. 예를 들어 부모의 인스턴스를 std :: shared_ptr로 만들고이 포인터를 자식에 복사 할 수 있습니다. 모든 자식과 부모가 범위를 벗어나면 부모는 삭제됩니다.

+0

아이는 기본적으로 부모에 대한 견해입니다. 어떤 뷰가 필요한지 예측할 수 없으며 오랫동안 필요하지 않을 수도 있기 때문에 부모에게 보관되기를 원하지 않습니다./ – Managarm

+0

오하이오. 내 대답을 편집하겠습니다 ... –

+0

편집 : 어쩌면 당신은 std :: shared_ptr use를 찾을 수 있습니다. 부모의 관리 포인터를 자녀들과 묶고 언어가 당신을 위해 청소하도록하십시오. –

관련 문제