Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
Допустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2018, 15:39 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devКто как решает подобную задачу?это какая то странная задача)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2018, 15:48 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
egorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя. Вот я и спрашиваю - кто и как решал подобную задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2018, 16:19 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devegorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя. Вот я и спрашиваю - кто и как решал подобную задачу? Это где такому учат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2018, 17:09 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devДопустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу? Вернись в постановке реальной задачи, а не к черезжопному представлению, как ее делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2018, 17:47 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devegorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя. Вот я и спрашиваю - кто и как решал подобную задачу? Ну как вариант, можно чекать внутри объекта если хотя бы раз у него вызывался неконстантный мембер, то он неконстантный и уже в деструкторе принимать решение на основе этого флага. Но это дурно пахнет, если честно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2018, 17:57 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devконструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзяи это правильно, ибо класс с константным конструктором не получится создать, а с константным деструктором - разрушить ))) PS смотри в stl, там сделали отдельные классы для таких извращённых случаев, iterator и const_iterator как пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2018, 19:10 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
Если я всё правильно понял, конструкторы вызываются для константных и не константных объектов. Разница только в точке вызова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 05:12 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
egorychи это правильно, ибо класс с константным конструктором не получится создать, а с константным деструктором - разрушить ))) PS смотри в stl, там сделали отдельные классы для таких извращённых случаев, iterator и const_iterator как примерВ том-то и дело, что при инициализации константного объекта он может быть проинициализирован константными значениями без их копирования в кучу, т.е. ссылаться на них, а при разрушении, естественно, не должен пытаться очистить эти ресурсы. Совершенно не хочется проверять в деструкторе, где именно находится ресурс - в куче или в ресурсах бинарного модуля. По всей видимости, придётся как-то выкручиваться через спецификацию шаблона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 09:31 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
CEMbЕсли я всё правильно понял, конструкторы вызываются для константных и не константных объектов. Разница только в точке вызова.И точка вызова у них может быть одна и та же. Разница лишь в том, что при вызове константного метода ему прилетает константный this со всеми вытекающими. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 09:33 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devИ точка вызова у них может быть одна и та же. Разница лишь в том, что при вызове константного метода ему прилетает константный this со всеми вытекающими. При вызове ему прилетает указатель и никто не знает какой он. https://msdn.microsoft.com/ru-ru/library/07x6b05d.aspx]Ключевое слово const указывает, что значение переменной является постоянным и сообщает компилятору , что программист не должен его изменять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 11:16 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
blonduser, что мешает проверить? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Результат компиляции: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 11:47 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_dev, С функциями Set const не используется обычно. Но вы знаете толк в извращения! Это происходит только в момент компиляции. Мой вариант работает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 12:02 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
blonduserЭто происходит только в момент компиляции.Естественно! Где же еще? :) Скомпилированный бинарный модуль не хранит информацию о спецификаторах. Ты же понимаешь, что доступ к любому члену экземпляра класса осуществляется по неявному указателю this, который можно указывать, а можно и не указывать в реализации метода, а доступ по константному указателю, это доступ read-only. P.S. Кстати, попробуй в моём примере строку с ошибкой заменить на строку из комментария. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 12:09 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_dev, Так ты что хочешь получить в результате? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 12:17 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
blonduserrdb_dev, так ты что хочешь получить в результате?Об этом я уже всё написал выше, а сейчас мы ушли в небольшой оффтоп на обсуждение особенностей константных методов. Если удастся сделать красивую реализацию на спецификации шаблона с дедукцией, выложу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 13:06 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devДопустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу? Ты неправ, деструктор у класса есть всегда, и он всегда вызывается. Реализация при этом одна и та же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 13:38 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devegorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя. Вот я и спрашиваю - кто и как решал подобную задачу? Ты можешь объявить два конструктора для const и не const объектов, и вызывать их соответственно. Отличать конструкторы друг от друга придётся руками (можно сделать два наследника, чтобы это было видно в названии класса). При этом ты можешь в конструкторе инициализировать некий флаг внутри класса, чтобы отличать, является ли данный экземлпяр const или не является. Ещё раз, при этом дифференцировать объекты по const|не const тебе придётся руками. Для упрощения можно ещё запрятать создание экземпляров в фабрику. P.S. да, задача идиотская, я согласен со всеми, кто так высказывался. Всё против объектной модели С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 13:43 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZivrdb_devДопустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу? Ты неправ, деструктор у класса есть всегда, и он всегда вызывается. Реализация при этом одна и та же.Я знаю, что деструктор есть всегда, поэтому и написал не "нет деструктора", а "нет реализации деструктора", имея в виду ~T() {} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 16:06 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Не отвлекайте его. Очень хочется на результат посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 16:18 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZiv... Отличать конструкторы друг от друга придётся руками (можно сделать два наследника, чтобы это было видно в названии класса). ... Для упрощения можно ещё запрятать создание экземпляров в фабрику. В этом случае, проблемы нет вообще. базовый класс, два наследника: TMyClassInHeap, TMyClassAsRef и просто virtual деструктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 16:33 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
blonduser, не дождешься! С дедукцией не получается, а без неё выходит банальный exactly specialized template, который даже школьник напишет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 01:51 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devРазница лишь в том, что при вызове константного метода ему прилетает константный this со всеми вытекающими.Это разница - для компилятора . Код не различает const. Я думаю, компилятор при генерации отличает ctor/dtor-ы от остальных методов. Т.е. ты не сможешь сам его позвать явно (не скомпилируется). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 05:26 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
CEMbЭто разница - для компилятора . Код не различает const. Я думаю, компилятор при генерации отличает ctor/dtor-ы от остальных методов. Т.е. ты не сможешь сам его позвать явно (не скомпилируется).Я так и написал: 21428334 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 09:30 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZivТы можешь объявить два конструктора для const и не const объектов, и вызывать их соответственно. Отличать конструкторы друг от друга придётся руками (можно сделать два наследника, чтобы это было видно в названии класса). При этом ты можешь в конструкторе инициализировать некий флаг внутри класса, чтобы отличать, является ли данный экземлпяр const или не является. Ещё раз, при этом дифференцировать объекты по const|не const тебе придётся руками. Для упрощения можно ещё запрятать создание экземпляров в фабрику. P.S. да, задача идиотская, я согласен со всеми, кто так высказывался. Всё против объектной модели С++.Неа, объявить const конструктор не могу! Конструкторы и деструкторы не могут иметь cv квалификаторы. В итоге получается два точно специализированных шаблона класса-обёртки (для const и не const) к интересующему классу, плюс typedef'ы для них. Вот так - банально и скучно. Нет возможности специализировать шаблон по объявлению lvalue. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вообще, в C++ очень много "недосказанности". К примеру: * Есть возможность "сказать" new const Type(), но нет возможности этот const хоть как-то "услышать" в реализации перегруженного оператора new, конструктора или деструктора класса; * Есть возможность переопределить placement new, но компилятор не симулирует его вызов при определении экземпляра объекта на стеке, хотя, такое поведение было бы логичным; * Можем специализировать шаблоны с дедукцией по параметрам конструктора, но не можем специализировать шаблоны с дедукцией по типу и квалификаторам объявления lvalue; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 10:28 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39648076&tid=2017848]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
51ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 181ms |

| 0 / 0 |
