Заблокирован
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Не хватает знаний. Не знаю, как на с++ реализовать возможность15.11.2011, 10:31. Показов 4078. Ответов 67
Метки нет (Все метки)
Есть одна вещь, которую у меня сделать никак не получается.
В моей старенькой 2008 студии отсутствуют стандартизированные интеллектуальные указатели. По этой причине я когда то написал собственные велосипеды для разных типов указателей. Вот так выглядит прототип метода, который загружает данные в сильнвй указатель (который умеет шариться)
Это нужно специально для того, что бы можно было обнулить аргумент. Вот так выглядит реализация метода:
Все это здорово, и прекрасно. Вот так это работает на практике:
Проблема в том, что я хочу сохранив инвариант сильного указателя, при этом иметь возможность написать вот так:
error C2664: TSharedPointer<TypeT>::TSharedPointer(TypeT *&): невозможно преобразовать параметр 1 из 'int *' в 'int *&' Вопрос: как сохранить возможность обнуления входящих указателей, но при этом иметь возможность скармливать интеллектуальному указателю оператор new ?
0
|
15.11.2011, 10:31 | |
Ответы с готовыми решениями:
67
Реализовать двусвязный список. В разных узлах одного списка может быть любой объект одного из допустимых типов (своих знаний не хватает) Выручайте, знаний не хватает Не хватает знаний. Выбор между ноутом и стационар Не могу сделать три задания, не хватает ещё знаний языка |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2011, 11:06 | 2 |
Bers, Как вариант просто перегрузить конструктор.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
15.11.2011, 11:31 | 4 | |||||
м? не лучший прием.
1
|
Заблокирован
|
|
15.11.2011, 11:40 [ТС] | 5 |
ForEveR, я думал о таком варианте. Но меня смущает то, что приходится кастовать константность.
Алена в своём блоге пишет: "Если снимать const с переменной, которая изначально была const, то дальнейшее её использование приведёт к undefined behaviour"(с) http://alenacpp.blogspot.com/2005/08/c.html Вот я и подумал.. тут беды никакой не будит? Я с этими константами до сих пор путаюсь
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2011, 12:49 | 6 |
Bers, М. В данном случае она константа только как формальный параметр.
0
|
Заблокирован
|
|
15.11.2011, 12:57 [ТС] | 7 |
Ну так то да. Номинально же объект не_константный, и номинальный указатель на него тоже не_константный, но почему тогда запускается именно метод с константным аргументом, а не метод с не_константной ссылкой?
Если передавать явный не_константный указатель, то он понимает, что нужно юзать метод с ссылкой, а не с константой. Но если запихивать new construct(); запускается именно метод с константным указателем. Как буд то бы оператор new возвращает константный указатель... Ну и Алена спп тоже панику наводит) в общем, я так и не совсем уловил принцип работы такого кода
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
15.11.2011, 13:44 | 8 | |||||
Bers, а нужно ли всё это? ИМХО, шаред-птры обычно как раз создают так:
0
|
Заблокирован
|
|
15.11.2011, 14:04 [ТС] | 9 |
Задача - получить класс сильного указателя, который обеспечивает безопасность собственной работы.
Для этого, если ему скормят обычный указатель, он должен суметь его обнулить Сильный указатель не будит шлёпать нерадивого программиста по попе, и не будит дожидаться рантайм еррор. Сильный указатель просто не позволит вызывающей стороне его поломать.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
15.11.2011, 14:19 | 10 |
Bers, однако сам может поломать вызывающую сторону, да?))
0
|
Заблокирован
|
|
15.11.2011, 14:23 [ТС] | 11 |
Вариант который предложил ForEveR реально работает. Я никаких проблем не вижу.
Если реально тут нет мины замедленного действия - то это отличный вариант. То, что нужно. Тогда класс вполне себе надежный получится. Придется ещё пораскинуть мозгами, как сделать так, что б его суметь поломать Но вдруг там что-то не так. Я даже не до конца понимаю почему если закинуть new , то сработает константный метод.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
15.11.2011, 14:33 | 12 |
Я о том, что на вызывающей стороне указатель становится невалидным. С моей точки зрения, это очень даже нехорошо.
Потому что отбрасывание константности - первый шаг компилятора при поиске кандидатов перегруженной функции/метода, если полного совпадения не нашлось. Поскольку оно нашлось, этого первого шага не происходит. Если я не ошибаюсь, конечно. Добавлено через 3 минуты Нет, похоже, всё-таки ошибаюсь...
0
|
Заблокирован
|
|
15.11.2011, 14:35 [ТС] | 13 |
Если класс забирает себе право владения объектом, то на вызывающей стороне в принципе не может оставаться валидного указателя.
Иначе какой смысл вообще юзать сильные указатели? Если снаружи остался ненулевой оригинальный указатель, значит сильный указатель не контролирует время жизни объекта. Значит там я могу сделать ему делете, а потом мой сильный указатель сделает крэш Я себе даже представить не могу ситуацию, зачем может понадобится сильный указатель, если при этом нужно что бы оригинал остался валидным.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
15.11.2011, 15:05 | 14 |
Так вот поэтому такие указатели и создают без промежуточных сырых указателей, а выделяя память прямо в аргументе конструктора.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
15.11.2011, 15:15 | 16 | |||||
Bers, Не обнулит.
http://liveworkspace.org/code/... bc80aebaf2 И ни один smart_pointer таким не занимается. Это не логично.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2011, 15:20 | 18 |
Bers, Да потому что. Человек создал указатель. Подал его в smart_pointer. А потом захотел использовать так, без вызова get() и получил бабах. Не красиво.
Ну и плюс к тому бустовские смарты могут использоваться далеко не только с new.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2011, 15:21 | 20 |
Bers, std::auto_ptr не присутствует в новом стандарте. Вместо него shared/weak/scoped etc.
0
|
15.11.2011, 15:21 | |
15.11.2011, 15:21 | |
Помогаю со студенческими работами здесь
20
Не знаю как реализовать Не знаю как реализовать Возможность доработки ERP системы без соответствующих знаний Canvas - не знаю как реализовать Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |