7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
||||||
1 | ||||||
Чем может быть чревато создание в классе адреса на другой класс09.06.2014, 02:15. Показов 1265. Ответов 20
Метки нет (Все метки)
Всем привет!
Я решил не заморачиваться с наследованием, так как у меня каждый класс использует только свои узкоспециализированные функции. А вот некоторые данные из класса все равно таскать приходится. Таким образом, у меня возникла вот такая, можно сказать, иерархия:
Вопрос в том, есть ли в такой реализации подводные камни, если есть, то какие?? Буду благодарен за любые предупреждения и мысли по этому поводу. Лично мне кажется, что никакой опасности нет, тем не менее чутье ноет о том, что здесь не совсем все так просто как кажется...
0
|
09.06.2014, 02:15 | |
Ответы с готовыми решениями:
20
наследование в классе нескольких функций из другого или как добавить функцию находящуюся в классе в другой класс Сколько может быть конструкторов в классе? Может ли в одном классе быть несколько конструкторов? Может ли индексатор быть переопределен в дочернем классе |
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
09.06.2014, 02:17 | 2 |
Голые указатели всегда опасны.
0
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|
09.06.2014, 02:25 [ТС] | 3 |
У меня структура даже сложнее чем я указал:
есть еще класс stage, который имеет в себе Paint и похожие по структуре на Paint классы и манипулирует ими тем же способом. Я планировал сделать ЕЩЕ класс, который будет манипулировать stage'ами, но у меня полезли какие-то настолько странные ошибки, что я отказался от идеи так глубоко залезать по классам и сделал просто функцию. Тем не менее такая сложная иерархия классов осталась (получается, что один класс имеет доступ к экземплярам двух классов, которые еще и создан один из другого).
0
|
Комп_Оратор)
|
|
09.06.2014, 03:00 | 4 |
Divergence, использование объектов классов или указателей на объекты классов в качестве полей классов это нормально. Если говорить об указателях, то это чуть более трудоёмко чем просто использовать сам объект. Разница почти та же, что и при использовании переменной указателя на стеке, но тяжелее то, что конструкторов не один и везде нужно побеспокоиться о инициализации указателя. То есть нужно выделить память, чем-то заполнить, а в деструкторе удалить.
В Вашем конструкторе копируется указатель и Вы не можете знать указывает он на что-то разумное или нет. Обычно в таких случаях делают иначе. Но сначала нужно написать конструктор без параметров и или закрыть его (тогда он может быть пустой) или выделить в нём память под объект и заселить её объектом по умолчанию. Закрывать - прём узкий. Это значит, что контейнеры STL использовать не выйдет, например. Написав открытые конструкторы Вы будете уверены, что как бы не создавался экземпляр, он будет инициализирован. А в конструкторе копирования тоже нужно бы выделить память и скопировать в неё объект из оригинала почленно. В деструкторе удалить. Тут лучше ничего не делать руками.
1
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|
09.06.2014, 03:16 [ТС] | 5 |
IGPIGP, спасибо за ответ!
Если честно, я не очень понимаю эти опасения по поводу того, что указатель может не указывать на существующую область памяти... у меня в коде сначала выделяется память, только затем в новый класс передается указатель. В случае такого грамотного подхода (когда ничего не забыто) опасности никакой нет? Или все же могут быть косяки? Например, я смутно предполагаю ситуацию, что в какой-то момент вызовется деструктор, который освободит память, на которую у меня несколько указателей по определению... Соответственно, несколько указателей будут указывать на пустоту. Однако, логика программы такова, что жизнь одного класса без другого просто не имеет смысла, поэтому уничтожаться они будут строго один за другим до самого конца. Остаются ли какие-то опасности при такой ситуации?
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
09.06.2014, 03:20 | 6 |
Сообщение было отмечено Divergence как решение
Решение
Зачем тогда создавать объект снаружи и передавать указатель на него? Почему бы не создать его внутри?
1
|
Комп_Оратор)
|
|
09.06.2014, 03:22 | 7 |
В случае такого грамотного подхода, само понятие опасности теряет смысл.
Какая может быть опасность для человека, которого не испугать? А что мешает написать конструктор по умолчанию, конструктор копии, деструктор и перегрузить оператор присваивания?
0
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|
09.06.2014, 03:30 [ТС] | 8 |
Спасибо за идею! Действительно, я подумаю об этом. Небольшие трудности создает только то, что в дальнейшем, мне может потребоваться один класс отдельно от другого для каких-то еще не придуманных сейчас целей. Это удерживает. Но скорее всего я последую совету
Добавлено через 5 минут Просто не могу заставить себя делать что-то сложное, когда можно сделать просто. Я сделал просто и понятно для себя, без лишних наворотов. Если бы я точно понимал какие плюсы мне даст вся эта перегрузка и куча конструкторов, и я бы эти плюсы посчитал существенными, то конечно сделал бы так. Именно потому, я и написал вопрос на форуме: я сделал просто, хотя обычно люди делают сложно, и причин для такой сложности я не увидел. Вот и хочу послушать аргументы в пользу сложного подхода. Но пока, на такую сложную модель переходить я не переубедился
0
|
Комп_Оратор)
|
|
09.06.2014, 03:35 | 9 |
Конечно!
Ведь при попытке объявить такой объект как сейчас на стеке нужно будет каждый раз инициализировать его руками. А заполнить вектор такими объектами? Лучше пусть это делает конструктор, а прямой доступ к указателю снаружи и закрыть можно бы.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
09.06.2014, 14:07 | 11 |
Divergence, удалять объекты надо в порядке обратном их созданию. Т.е. сначала MyPaint, потом MyObject. А вообще, см. что такое "умные" указатели.
По приведенному ТС коду, проблемы с нулевым указателем нет.
0
|
Jupiter
|
09.06.2014, 14:33
#12
|
0
|
Jupiter
|
09.06.2014, 15:34
#14
|
0
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|
09.06.2014, 23:33 [ТС] | 16 |
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
09.06.2014, 23:36 | 17 |
0
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|
09.06.2014, 23:53 [ТС] | 18 |
Пока что я увидел опасность только в кодере, который может ошибиться. Другие аргументы меня не убедили. Как я понял, народ настаивает на создании еще одного пустого конструктора? А вот зачем сюда нужна перегрузка операторов - вот совсем не понял. Добавлено через 13 минут Вы были абсолютно правы. Я сейчас собрал простенький проект с тестовыми классами (чтобы не морочиться с большим кол-вом кода). Если ссылку на один и тот же класс используют два класса (а у меня именно такая ситуация и назревала), то деструктор выкидывает в ошибку, так как я пытаюсь удалить пустоту. Вот и ответ на мой вопрос... нельзя передавать в класс просто ссылки на классы (особенно если они инициализированы в динамической памяти). Нужно работать с объектами других классов только внутри самого класса.
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
10.06.2014, 00:44 | 19 |
Для этого придумали умные указатели. std::shared_ptr, думаю, подойдет для данного случая.
2
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|
10.06.2014, 01:38 [ТС] | 20 |
0
|
10.06.2014, 01:38 | |
10.06.2014, 01:38 | |
Помогаю со студенческими работами здесь
20
5 короткий сигналов биос, может ли дело быть в чем то другом чем в процессоре? Определите,может ли этот IP-адреса быть назначен узлом Сколько в классе может быть объявлено не статических конструкторов по умолчанию? Стоят планки с частотой выше, чем поддерживает чипсет. Чем чревато? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |