22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
|
|
1 | |
Понимание для чего вообще нужны указатели?12.11.2011, 20:12. Показов 31324. Ответов 112
Метки нет (Все метки)
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
1
|
12.11.2011, 20:12 | |
Ответы с готовыми решениями:
112
Для чего нужны указатели? Для чего нужны указатели на функции? Ссылки и указатели, для чего нужны те и другие? Для чего нужны и зачем использовать smart-указатели? |
Заблокирован
|
|
15.11.2011, 06:47 | 81 |
Дело не в том, о чем думали девелоперы библиотеки. Дело в том, что грамотный класс инвариантен. Его нельзя сломать снаружи.
Если класс не_инвариантен, значит он зависим от того, насколько корректно его использует вызывающая сторона. А в большом проекте , где Вася может быть не в курсе, чего делает Петя, это означает потенциальная возможность заложить мину замедленного действия. и даже не заметить этого. Если класс не инкапсулирует в себе свою зону отвественности, и успех его работоспособности зависит от корректности вызывающей стороны - такая система ненадёжна. В такой системе программистам потребуется больше времени тратить на исправления ошибок, тестирование, отладку, и тп.
0
|
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
|
||||||||||||||||
15.11.2011, 06:52 | 82 | |||||||||||||||
Пожалуй приведу пример решения одной задачи, где я использовал указатели. Может быть существует другой способ решения, который я не знал.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.11.2011, 07:03 | 83 |
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.11.2011, 07:23 | 85 |
При построении дерева указатели реально нужны, но класс дерева полностью их инкапсулирует и наружу не выдаёт. Динамический массив нельзя сделать без указателей явных, или скрытых, но класс динамического массива полностью инкапсулирует свой укказатель на данные и наружу не выдаёт.
Обратил внимание на комментарий в калссе B и на реализацию конструктора класса A? Мораль же всей басни такова: указатели необходимы, без них нельзя сделать ничего, кроме калькулятора, но используя их, надо все указатели, кроме указателей на функции, прятать в pirvate полях и наружу не выдавать, классы же должны иметь понятные и хорошо документированные интерфейсы. Нельзя использовать то, чего не понимаешь, а если возникает такая необходимость - пиши хоть тестовые примеры, но сначала изучи, а потом реально используй, а не наоборот.
0
|
Заблокирован
|
|
15.11.2011, 07:25 | 86 |
Вы понимаете, что втолковываете мне очевидные для меня вещи?
Я прекрасно это все знаю. И где можно использовать, и где нельзя. Я вам говорю - нельзя в любой момент времени лазить по указателю. Можно тогда, и только тогда, когда есть 100% гарантия валидности указателя. Вот вам ещё реальный случай: большой проект, над которым работало несколько человек. Менеджер держал свои объекты в векторе. А наружу выдавал интерфейсный указатель на эти объекты. Что бы снаружи нельзя было поломать объекты через указатель. Казалось бы - все круто. Все нормально. Проблемм быть не должно. Переодически крэш всей системы. Причём каждый раз в разных местах. Причем не постоянно, а довольно таки редко. Даже не понятно, что является причиной аварий. Трудно найти баг, который проявляется лишь изредка, причем каждый раз в разных местах. И только потом, после многодневных поисков, и отчаянного тестирования, выяснилось. Внимание: когда заканчивался резерв памяти вектора, он делал реалок. Все внешние ссылки на объекты становились не_валидными. Но поскольку, это происходило только когда у вектора заканчивался резерв памяти, то происходило это не постоянно, а только через раз. А интерфейсный указатель об этом не знал. Никому в голову не приходило, что объект, который по замыслу не должен вообще никуда двигаться, может поменять своё место жительство. Программист допустил ошибку. Он либо должен был юзать list вместо vector Либо интерфейсный указатель должен был обращаться к объекту по индексу массива (им не страшны реалоки), а не по указателю напрямую. Но это была ошибка, которую искали несколько дней. Допустить такую ошибку очень просто. А если ещё у вас при этом классы сами не будут следить за собственной безопасностью, а уповать на корректность программистов, то количество таких багов вырастет в геометрической прогрессии.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
15.11.2011, 07:30 | 87 | |||||
Ты думаешь, я этого не понимаю? А теперь прикинь:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
15.11.2011, 07:49 | 89 | ||||||||||
Указатели внутырь массива вычисляю только для однократного использования, а из перегпруженных опреторов [] возвращаю только ссылки. Причём, если массив динамический, то сначала обращаюсь к методу, возвращающему число элементов, а только потом использую индексы.
Добавлено через 2 минуты А смысл в том, в таком коде после выделения памяти гарантия существования данныхз и валидности указателя есть всегда. И обращаться к данным по указателю можно когда угодно. Торопился, забыл вместо
Добавлено через 6 минут Пост № 80!
0
|
Заблокирован
|
|
15.11.2011, 07:51 | 90 |
Если вы гарантируете, что объект жив - значит никто его убить без вашего позволения не сможет.
Голому указателю в любой точке программы можно сделать delete Что мне помешает убить данные по указателю? Добавлено через 1 минуту Не вижу никакой связи между темой инварианта класса, и 80м постом
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.11.2011, 08:23 | 91 |
А связь в том, что я сочинил инвариантную мину. От класса B она вообще не зависит.
Добавлено через 4 минуты Ни чего, но если ты заранее решил убить объект в единственном месте при завершении программы, своего решения не менял, а прогу написал один, то про себя ты знаешь, что ни где в программе неожиджанного освобождения нет по факту, а это и есть гарантия. Но лучше так не делать.
0
|
Заблокирован
|
|
15.11.2011, 08:25 | 92 |
Там один объект принимает на входе знание о другом объекте. И убивает его.
Причем снаружи объект "как бы жив". Он не знает, что его уже убили. Не понятно, а при чем тут инвариант? Инвариант класса, это свойство класса, при котором работа класса не зависит от корректности вызывающей стороны. То есть, класс сам проверяет валидность аргументов всех своих функций, и тд. Так же, он не выдаёт наружу объекты, или указатели, с помощью которых снаружи можно будит ничайно его повредить. Так же, он не кидает исключений, за исключением исключительных ситуаций.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.11.2011, 08:26 | 93 |
Инвариантность придумана не айтишниками, означает независимость ни от каких условий, моя мина ни от чего не зависит.
0
|
Заблокирован
|
|
15.11.2011, 08:36 | 94 |
Это не гарантия. Это устное, ничем не подкрепленное соглашение.
Ошибки в программах возникают по ничайности в непредсказуемых для самих программистов местах. Сделали класс, протестировали. А что значит протестировать? Значит погонять все методы класса со всеми возможными аргументами. Самыми кривыми. И посмотреть, как класс будит справляться. Но если осталась лазейка, через которую сможет забраться баг, то по теории ошибок именно через эту лазейку он туда и залезет. Если программист думает: "клянусь! Что никогда не буду кормить классу указатели объектов созданных на стеке!" То это означает, что когда нибудь его класс обязательно крякнет именно потому, что он допустил устное соглашение, но не дал никаких гарантий. Вот у меня был случай: сделал шаблонный низко-уровневый класс. И протестировал его вроде бы. Потом уже делал домашний проектик, и оказалось что в этом низко-уровневом классе есть баг (не качественно протестировал. Поленился) Вот понять, что виноват именно этот низкоуровневый было не просто. Потому что авария происходит наверху по вине того, кто на несколько уровней ниже. Пришлось в отладчике смотреть что происходит на нескольких уровнях. Понял, что косяк в этом классе. Пришлось создать отдельный проект, где отдельно подключался только этот класс один. Исправлялся, потом заново тестировался. И только потом опять запускал основной проект, где уже запускалась исправленная версия класса. И уже смотрел, устранилась ли проблема, или нет. И все это потому, что я не до конца обеспечил инвариант класса. Класс не отвечал полностью за безопасность своей работы. Потратил бы на 10 минут больше времени на тестирование, мне не пришлось бы потом тратить 3 часа на поиски проблемы в более крупном проекте.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.11.2011, 10:50 | 95 |
Согласен. Но не такие же! Я умудряюсь не тратить время на отладку конкретно по указателям и адресации на их основе, даже работая с линейным массивом, как с неявно-двумерным и пересчитывая индексы не уровнем ниже в классе-контейнере, а непосредственно в функции, реализующей сам алгоритм, да ещё и навесив на него там же сразу два блочных кода, но вылетать за пределы массива сотни, а часто и более тысячи раз на одном проекте по индексам.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
15.11.2011, 11:22 | 96 | |||||
Bers, В мире не все идеально. И работа с указателями не сложна. Если не делать подобных вещей.
0
|
Заблокирован
|
|
15.11.2011, 11:59 | 97 |
За совместимость с СИ, с++ пришлось заплатить свою цену.
Но если стандартный стринг нарушает инкапсуляцию во имя совместимости с си, это не значит, что нужно брать с него пример, и в оо-архитектуре нарушать инкапсуляцию каждый раз, когда захочется слентяйничать и сделать "быстро и сердито"
0
|
Higher
|
|
15.11.2011, 13:05 | 98 |
Опасна? о_О
Вполне утечет. Забыл написать деструктор - утечка. Забыл написать оператор присваивания - утечка + UB. И еще куча вариантов. Обертка как раз не позволяет делать опасные вещи. Первое что пришло в голову - вывести все файлы в текущей папке. Правда это скорее системная задача, но указателям там разумного применения нету.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.11.2011, 13:24 | 99 |
И как же его можно умудрится забыть написать?
Добавлено через 6 минут Ни одна прилада самостоятельно список файлов не выводит. Да и не задача это, а подзадача. А ты приведи пример целиком задачи, решение которой могло бы иметь самостоятельную практическую ценность отдельно от других прибамбасов (за исключением ОС и самого компьютера) и при этом могло бы быть получено без указателей в какой бы то ни было части программы, включая и те, что решают подзадачи и зовутся подпрограммами. Только не говори "повторить блокнот, используя TMemo", или "Сделать растровый криворедактор на базе TImage" - это не прикладные, а скорей учебные задачи. В любой же реальной задаче будет текст, состящий из заранее не известного числа не только символов, но и строк, заранее не известный размер статистической выборки, или матрицы коэффициентов системы уравнений, математическое выражение неизвестной длины или ещё какая пакость, требующая динамического выделения памяти. И на все подзадачи ты просто не найдёшь готовых библиотек, а среди нерешаемых библиотеками хоть и нет гарантии встретить подзадачу, для которой понадобится явный указатель, но нет и обратной гарантии.
0
|
Higher
|
|
15.11.2011, 13:29 | 100 |
Мало ли. Забыл, опечатался = утечка. Все совершают ошибки, вот только с использованием чистых указателей их иногда довольно проблематично найти.
Что-то у меня фантазия барахлит, ни одной точной формулировки придумать не могу. Ну, допустим, сделать программу для врачей, в которой можно будет онлайн редактировать информацию о пациентах. При этом база данных на каком-нибудь сервере лежать будет. P.S. еще есть такой факт, что очень много корпоративного софта пишется на яве, в которой указателей нету вообще.
0
|
15.11.2011, 13:29 | |
15.11.2011, 13:29 | |
Помогаю со студенческими работами здесь
100
Что за драйвера такие, для чего они и нужны ли они вообще? С чего начать для понимание PHP Указатели на указатели: для чего они могут понадобятся? Понимание звуковой волны , да и вообще волн в целом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |