2016-09-13 3 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

Вы не хотите копировать объект, но копируете Child 'ret' ... – Jarod42

+0

В чем смысл этого кода? 'Child :: it' выглядит как обещание висячего итератора – wasthishelpful

+0

@ Jarod42' objects' - это вектор в 'Parent'. Копирование «Ребенок» в порядке, я просто не хочу копировать вектор в возвращаемый ребенок :) – Managarm

ответ

1

Наличие ребенка в качестве члена родителя поможет вам обеспечить его (особенно если вы не передадите ссылки на ребенка и не сохраните их где-нибудь в другом месте). Принцип прост: ребенок построен внутри родителя, и он не будет уничтожен до тех пор, пока родитель не будет.

Что касается копирования объектов, вы всегда можете раздавать ссылки или указатели. Там нет значительного штрафа за копирование.

В другом порядке, итераторы (как у вашего ребенка) могут быть легко признаны недействительными после изменения содержимого их контейнера, поэтому я буду опасаться их.

Редактировать: После вашего комментария вы можете попытаться использовать shared_ptr для ссылки на ваши родительские объекты. Они оставят родителя живым, пока, по крайней мере, у них есть ребенок. std :: shared_ptr подсчитываются по ссылке и имеют небольшие накладные расходы над обычным неуправляемым указателем. Например, вы можете сделать экземпляр вашего родителя как std :: shared_ptr, а затем скопировать этот указатель на дочерние элементы. После того, как все дети и сам родитель будут недоступны, родитель будет удален.

+0

Ребенок - это в основном взгляд на Родитель, я не могу предсказать, какие виды потребуются, и я также не хочу, чтобы их держали в Родитель, потому что они могут не понадобиться долго:/ – Managarm

+0

Ох, я вижу. Позвольте мне отредактировать мой ответ ... –

+0

Отредактировано: может быть, вы можете найти std :: shared_ptr для использования. Свяжите управляемый указатель родителя с вашими детьми и дайте языку очистить вас. –

Смежные вопросы