2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
1 | ||||||
Запрет shared_ptr быть наследником определённого класса26.04.2017, 22:10. Показов 881. Ответов 14
Метки нет (Все метки)
Добрый день,
0
|
26.04.2017, 22:10 | |
Ответы с готовыми решениями:
14
Как обратится к обьекту класса, являющегося наследником абстрактного класса как узнать,является данный объект класса А1 наследником класса А2 Использование конструктора базового класса наследником Разработать класс ForeignBilet, являющийся наследником класса Bilet |
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
26.04.2017, 23:35 | 2 |
так и нужно запрещать не наследников,
а тех, у кого есть свой RefCounter. для этого нужно четко обозначить признаки: как определить, есть ли у класса RefCounter? может быть у класса с RefCounter есть какой то особый метод?
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
27.04.2017, 00:00 [ТС] | 3 |
hoggy, так как я знаю, что вы знакомы с cocos2dx - проблема на лицо
Если хранить поле класса как умный указатель и случайно/неслучайно через некоторое время добавить его в Node ( addChild(ptr) ) то память будет уничтожена дважды, когда умрёт родительский Node и при очистки умного указателя - хочу защитить самого себя от самого себя! Данный способ сработает? Если я когда-то добавлю классу признаки cocos2dx - везде где были "мои" умные указатели на этот класс начнётся дикая ругать
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
27.04.2017, 02:00 | 4 |
1
|
27.04.2017, 08:39 | 5 |
Очень похоже, что проблемы нет, а задача надуманная. С++ не простой язык, постоянно приходиться думать о том, что и как ты пишешь. Попытка дать программисту возможность не думать неоправданно усложняет все вокруг.
Имхо - я бы так не заморачивался, кто-то накосячил - сам дурак. Добавлено через 4 минуты а так можно свой make_shared, но это не дает 100% защиты, кто-то может создать shared_ptr без хелпера, но свой класс для shared_ptr также не дает 100% защиты, кто-то может создать shared_ptr и без него. Добавлено через 4 минуты ну и совсем дурной вариант - добавить в std специлизацию (через enable_if<has_ref_counter<T>>>), но за это по рукам бьют, в лучшем случае сразу.
1
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
27.04.2017, 11:41 [ТС] | 6 |
As always .....
Так можно написать про все использования static_assert поиск std::shared_ptr по проекту подскажет в этом и заключается тема, если в проекте на уровне кодинг стайла будет запрещено использовать стандартные умные указатели - всё же норм будет?
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
|
27.04.2017, 11:46 | 7 |
Производные сущности не могут контролировать подобные аспекты
Если вам не нужно наследоваться от шаред пойнтера - просто не делайте этого
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
27.04.2017, 11:55 [ТС] | 8 |
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
27.04.2017, 12:00 | 9 |
Можно конечно, но стоит помнить про закон Мёрфи. И видимость что "всё хорошо" может оказаться хуже.
Раз уж начали обсуждать "плохие решения", то могу предложить ещё один плохой вариант - препроцессором shared_ptr менять на MySharedPtr.
1
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
27.04.2017, 12:06 [ТС] | 11 |
Умные от утечки памяти, через месяц в дальнем дальнем файле определённой глубины кто-то решит наделить класс свойствами cocos2dx - всё будет работать, но падать в деструкторах при закрытии приложения без указания, где именно.
Накатал 100500 коммитов в отдельной ветке, подтянул мастер - падение в деструктор - а где не ясно. Ревью 100500 коммитов? Там всё норм. Ревью 100500 коммитов новых в мастере - и там всё норм "вроде бы", а вот вместе падение
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
|
27.04.2017, 12:07 | 12 |
rikimaru2013,
У вас в примере идет наследование от шаред пойнтера которое вы как я понял хотите запретить в определенных условиях. Отвечая на вопрос "что" я говорю, что просто не наследуйтесь/не создавайте шаред там где это не нужно Вот и все
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
|
27.04.2017, 13:08 | 14 |
MrGluck,
Ну заголовок во всяком случае о наследовании... ИМХО запретить делать глупости не получится, всегда можно написать код который будет делать что-то не хорошее Нормальное решение в таком случае это не подпускать сомнительных разработчиков к проекту а не явные моменты хорошо документировать в том же readme или где нибудь еще. Если слишком уж болит голова относительно одного конкретного случая, можно попробовать пересмотреть архитектуру что бы исключить наболевшую проблему.
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
27.04.2017, 13:57 | 15 |
rikimaru2013, Почему-то никто главного не сказал. Мешать разные системы автоматического управления памятью - плохая идея.
shared_ptr тоже считает ссылки, просто счетчики разные в этом и проблема.Не знаю, как там в cocos-е, но обычно если используется подсчет ссылок - деструктор должен быть protected (см. систему фасетов, например, а во всяких С# и прочих java просто нет delete, хоть реализация разная, смысл один - не дать удалить объект вручную). Тогда создать shared_ptr от класса с подсчетом ссылок просто не получится. Кроме того, при создании объекта обычно можно указать начальное значение счетчика ссылок и предотвратить его автоматическое удаление. Но лучше, все-таки, Использовать штатные средства движка (наверняка есть аналог shared_ptr в движке, в конце концов, как-то же объекты друг на друга ссылаются), тогда проблема исчезнет сама собой.
1
|
27.04.2017, 13:57 | |
27.04.2017, 13:57 | |
Помогаю со студенческими работами здесь
15
Разработать класс SpecSpec, являющийся наследником класса Spec (специальность) Как из перегруженных операторов базавого класса возвратить атоматизированный тип аргументов, тип которых является наследником Запрет определенного устройства Шаблон класса, параметром которого должны являться наследники определённого класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |