|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
31.07.2013, 11:19 | #1 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 224
|
weak_ptr и this
Допустим, есть следующий код:
Код:
Как правильно реализовать конструктор класса B? Код:
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
|
31.07.2013, 18:17 | #2 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2sVasilich
если ты собрался в классах использовать умные указатели, ссылающиеся друг на друга, тебе сначала нужно где-то создать объекты этих классов. можно сделать например так: Код:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
01.08.2013, 15:27 | #3 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 224
|
pproger, спасибо за ответ.
Получается, что задачу (вроде как тривиальную), приведенную в первом фрагменте кода с помощью интеллектуальных указателей решить нельзя? Т.е. есть родительский объект, у него есть дочерний объект. Родительский объект об этом знает. Дочерний объект знает о своём родителе. Вне родителя дочерний объект не виден. При этом, сырые указатели использовать не хочется, чтобы ребёнок не мог сделать, например, так: Код:
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
Последний раз редактировалось sVasilich; 01.08.2013 в 15:31. |
01.08.2013, 15:51 | #4 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
sVasilich
Задача: заменить обычные указатели на интеллектуальные. В классе A используется std::shared_ptr, в классе B - std::weak_ptr. Код:
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
01.08.2013, 15:59 | #5 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
sVasilich
При этом, сырые указатели использовать не хочется, чтобы ребёнок не мог сделать, например, так: Пытаться забить гвозди микроскопом - это дело конечно очень весёлое... Но нормальные люди добиваются той же задачи делая деструктор закрытым :lol:
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
01.08.2013, 16:19 | #6 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 224
|
Rififi, спасибо, то что нужно!
Про enable_shared_from_this я нагуглил, но с использованием не разобрался, теперь понятнее. Но нормальные люди добиваются той же задачи делая деструктор закрытым :lol: А можно про правильный способ забивания гвоздей на примере? Как потом вызывается деструктор, когда нужно действительно удалить родителя?
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
|
01.08.2013, 23:35 | #7 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Но почитав тред, понял: в конкретно данной ситуации его существование излишне. Ребенок не самостоятелен. Он - собственность родителя. Нет родителя - нет детей. Родитель держит сильный указатель на детей. Дети держат сырой указатель на родителя. Детенка не может существовать без родителя. Следовательно, сырой указатель на родителя априори валидный. Поэтому, пока детенка жив - он всегда сможет безопасно обратится к родителю. Мертвые детенки уже ни к кому не обращаются, потому что их больше не существует. При разрушении Родителя, сильные указатели автоматически ликвидируют детей. Вместо сильного можно использовать unique_ptr. Хотя лично я предпочитаю иметь дело с как можно меньшим количеством сущностей в коде. На моей практике shared_ptr покрывает всю область применения указателей. Ни разу не сталкивался с ситуацией, когда кроме него потребовался бы ещё какой нибудь. Что касается закрытых диструкторов: детенка объявляет родителя другом. Теперь только родитель сможет ликвидировать дитенку. Больше никто. Но в этом нет никакого смысла, ибо кроме родителя все равно никто к детенке доступа не имеет. Можно закрыть диструктор родителя, что бы его "ничайно" не прибил детенка. Однако, делать защиту от саботажа (ну или от дибилов) - напрасное усложнение кода и трата времени. На верхнем (уровень бизнес-логики) уровне самостоятельное использование new/delete - признак говнокода. Последний раз редактировалось _Bers; 01.08.2013 в 23:42. |
|
01.08.2013, 23:57 | #8 | ||||
Форумчанин
Регистрация: 16.12.2009
Сообщений: 224
|
Цитата:
Код:
Цитата:
Цитата:
Цитата:
Код:
ps Положительный отзыв оставить система не даёт вообще ни кому из ответивших, поэтому придётся ограничится устным спасибо
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
|
||||
02.08.2013, 01:43 | #9 | ||||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
А вообще, я ни разу за все время не сталкивался с циклическими ссылками. В том плане, что ни разу не было необходимости в архитектуре "ресурсы, которые владеют друг другом". Всегда был только один хозяин, который владел ресурсами. Но никогда ресурсы не владели своим хозяином. В чужом коде встречал, да. Но там налицо было переусложнение кода. Так, словно архитектура была создана ради архитектуры, а не для решения задач насущных. Я не телепат. Откуда я знаю, кто владеет вашим родителем. Цитата:
Цитата:
Ничего другого они с ним больше не делают. Достаточно взять себе за правило: не удалять, и не создавать самостоятельно ничего по сырому, и все будет оккей. Но и без этого во всех книжках пишут: кто выделял, тот и должен удалять, или получится каша. Делать защиту от дибилов - глупо. От саботажа - ещё глупее. Цитата:
Когда я пишу: "не нужно использовать низкоуровневую работу с выделением/освобождением памяти на уровне бизнес-логики приложения", то я имею ввиду вообще не использовать операторы new/delete Если нужно создавать объекты в куче, к вашим услугам контейнера, которые сделают это все за вас: Код:
Сырые же указатели лучше использовать только там, где архитектура гарантирует валидность сырого указателя. Низкоуровневую же материю стоит трогать только если задача - написать собственный инструментальный механизм, наподобии пула памяти, или интеллектуального указателя. В вашем случае ребенку можно предоставить сырой указатель. Слабый указатель в этой ситуации избыточен. Последний раз редактировалось _Bers; 02.08.2013 в 01:50. |
||||
02.08.2013, 09:42 | #10 | ||
Форумчанин
Регистрация: 16.12.2009
Сообщений: 224
|
_Bers, спасибо, теперь всё стало на свои места.
Цитата:
Цитата:
Кхм.. Последний кусок кода, это мне уже видно спать хотелось Конечно же должно быть: Код:
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
|
||