Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
у MS была такая неудобная штука, declspec(property), которая позволяла заводить псевдоним для переменной, к которому были привязаны set и get. Так как get обычно штука простая, то я нашёл для себя делать так: Код: plaintext 1. 2. 3. 4. 5. Кто что думает по этому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 05:34 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMb, показал бы как это работает, а то без поллитры тут явно не разберёшься ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 08:22 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)показал бы как это работает, а то без поллитры тут явно не разберёшься Я так понимаю речь про readonly доступ к Type Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 08:26 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMb, const_cast'ом можно обойти read-only защиту. Если сильно хочется, можно завести шаблонный класс Property и переопределить у него operator=() и operator T(), которому в конструкторе можно передавать лямбды-аксессоры, которые будут вызываться в этих операторах. До пропертей сисярпа/питона далеко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 08:36 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
Dima T, теперь понял, старею видимо NekZ, Ему просто нужна абстракция, что бы "не налететь". Обходы понятно всегда есть, главное что бы они были "видимые" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 08:56 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
NekZconst_cast'ом можно обойти read-only защиту.дело не в защите, дело в автоматике и удобстве, чтобы я по ошибке не написал в коде: Код: plaintext 1. и при это не надо было бы писать: Код: plaintext 1. NekZЕсли сильно хочется, можно завести шаблонный класс PropertyИ так я тоже делаю, но у этой конструкции немного другой смысл. NekZДо пропертей сисярпа/питона далеко.а чем они так уникальны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 09:01 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMb, я так и не понял - чего ты хочешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 09:19 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_dev, я хочу переменную, которую: 1. можно писать-читать в классе и/или иерархии классов 2. можно только читать вне класса и/или иерархии классов Т.е. более простой (синтаксически и по коду) аналог get-a. Read-only-представитель переменной наружу. Ну и это, как бы, топик про исследование подходов к решению таких или подобных задач ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 10:08 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbдело не в защите, дело в автоматике и удобстве, чтобы я по ошибке не написал в коде: Код: plaintext 1. и при это не надо было бы писать: Код: plaintext 1. Сложно, не распарсил. CEMbNekZДо пропертей сисярпа/питона далеко.а чем они так уникальны? Уникальны тем, что они уже есть в самой грамматике языка out-of-the-box, а также они имеют больше возможностей для создания DSL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 10:26 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMb, мне кацца, будто я уже показывал тебе подобный способ: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 11:12 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
Естественно, можно и так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2018, 11:26 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
NekZУникальны тем, что они уже есть в самой грамматике языка out-of-the-box, а также они имеют больше возможностей для создания DSL.а что они конкретно умеют, в чём преимущество перед C++? rdb_devCEMb, мне кацца, будто я уже показывал тебе подобный способ:Интересный вариант, но это немного перпендикулярно к тому, о чём я говорил. И вдобавок, это set, а не get. А ещё у тебя там пара кастов, которые можно было бы заменить шаблонной функцией? А вот последний оператор мне не понятен. Ну, т.е. понятно, что указатель на родительскую структуру вычисляется по смещению. А это надёжно? Не проще ли как-то в конструкторе в SET передать указатель/ссылку сразу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2018, 05:23 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbа что они конкретно умеют, в чём преимущество перед C++? Да хотя бы та же интроспекция в рантайме и создание новых типов "на лету". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2018, 08:25 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbИнтересный вариант, но это немного перпендикулярно к тому, о чём я говорил. И вдобавок, это set, а не get.Там и set есть... Приглядись повнимательней! Он в отдельной инкапсулированной структуре. CEMbА ещё у тебя там пара кастов, которые можно было бы заменить шаблонной функцией?Да, конечно можно. CEMbА вот последний оператор мне не понятен. Ну, т.е. понятно, что указатель на родительскую структуру вычисляется по смещению. А это надёжно?Конечно надёжно! Обычное взятие адреса и арифметика указателей... Никакого доступа к памяти по разыменованию указателя, приводившего бы к т.н. "неопределённому поведению" тут нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2018, 09:34 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devТам и set есть... Приглядись повнимательней! Он в отдельной инкапсулированной структуре.Нене, вот именно, я говорил про get только. И я говорил про отдельную переменную в классе, а у тебя пример про работу с самим классом через set. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2018, 13:54 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbНене, вот именно, я говорил про get только. И я говорил про отдельную переменную в классе, а у тебя пример про работу с самим классом через set.Так адаптируй пример под свою задачу. Делов-то... Просто я так точно и не понял, что именно, в итоге, ты хочешь получить и не сделал так, как ты хочешь. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2018, 14:24 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devТак адаптируй пример под свою задачу. Делов-то...так моё решение в одну строчку... rdb_devПросто я так точно и не понял, что именно, в итоге, ты хочешь получить и не сделал так, как ты хочешь. :)я хотел сделать простой механизм для read-only, чтобы переменную извне можно было читать, но нельзя писать. Я сделал константную ссылку на закрытую переменную, т.е. сам класс может работать с переменной, а наружние могут только читать её через ссылку. И я хотел узнать, нет ли где ошибки в моём решении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 05:07 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMb, Единственный минус, который я вижу - дополнительный указатель в каждом экзэмпляре подобного типа. Для крупных типов это не проблема, а если тип мелкий и состоит из пары интов, то их размер вырастает на треть(а то и в половину). И если таких эксзэмпляров миллион, то это 4(8)МБ дополнительной памяти. И компилятор не имеет права выкинуть это поле, хотя пользоваться им, скорее всего, не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 05:15 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
ну и лично для меня - это определяющий минус. я считаю, что держать в памяти бессмысленные данные нельзя, это повышает энтропию и приближает тепловую смерть вселенной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 05:19 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devПросто я так точно и не понял, что именно, в итоге, ты хочешь получить и не сделал так, как ты хочешь. :)я хотел сделать простой механизм для read-only, чтобы переменную извне можно было читать, но нельзя писать. Я сделал константную ссылку на закрытую переменную, т.е. сам класс может работать с переменной, а наружние могут только читать её через ссылку. И я хотел узнать, нет ли где ошибки в моём решении?[/quot]Всего лишь? Я-то думал... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 05:23 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
alex_kЕдинственный минус, который я вижу - дополнительный указатель в каждом экзэмпляре подобного типа.Какой дополнительный указатель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 05:26 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devКакой дополнительный указатель? Который ссылка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 06:29 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
NekZrdb_devКакой дополнительный указатель? Который ссылкаЗдесь тоже есть ссылка - prvalue оператора приведения типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 07:06 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbу MS была такая неудобная штука, declspec(property), которая позволяла заводить псевдоним для переменной, к которому были привязаны set и get. Так как get обычно штука простая, то я нашёл для себя делать так: Код: plaintext 1. 2. 3. 4. 5. Кто что думает по этому? Я думаю, что это нестандарт и must die. (это про declspec(property), не про код) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 15:57 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
MasterZivЯ думаю, что это нестандарт и must die.Что именно? Надо развернуть вопрос ширше По-правильному мы держим все переменные в private-секции, чтобы чужие классы не могли без нашего ведома поменять их значение. А чтобы они могли, когда это нужно, надо завести пару функций, set и get. Тут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Поэтому я считаю, что когда ввод-вывод значения в переменную класса не нуждается в проверках - set и get делать ненужно, а просто сделать переменную public и, если надо, назвать соответствующе нотации. Частный случай, когда никто кроме самого класса установить значение переменной не может, вместо get-а можно(?) использовать public const-ссылку на эту переменную, что я и написал в первом посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 05:20 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbТут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Это значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 10:12 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbА чтобы они могли, когда это нужно, надо завести пару функций, set и get. Тут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Поэтому я считаю, что когда ввод-вывод значения в переменную класса не нуждается в проверках - set и get делать ненужно, а просто сделать переменную public и, если надо, назвать соответствующе нотации. Частный случай, когда никто кроме самого класса установить значение переменной не может, вместо get-а можно(?) использовать public const-ссылку на эту переменную, что я и написал в первом посте.так-то оно вроде так, когда местечковый класс пишешь. Но вот когда твой код уходит в виде либы начинаются ходьбы по граблям из-за бинарной несовместимости. Я бы не очень обрадовался если бы какой-то разраб каждый раз интерфейсы менял на свою динамическую либу. Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую), т.е. полупустой метод для установки это необходимое зло для обеспечения совместимости. Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 11:20 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Это один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 11:47 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
alex_kЭто значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать.а кому их отдать? Я имел ввиду неконтролируемые значения. kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь? rdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь? kealon(Ruslan)Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля.Ну с этим случаем всё ясно, я про это упоминал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 05:22 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbа кому их отдать? Я имел ввиду неконтролируемые значения. я тоже. Если класс не контролирует эти значения, значит они ему не нужны. Просто, кто то приходит и кладет их. Кто то приходит и берет. А временем жизни управляет класс. Это неправильно. Классу нужно обладать теми данными, которые он использует. Это допустимо, если вся суть этого класса - хранить эти значения. Типа настройки какие то. Но тогда тут достаточно и структуры, рид онли которой достигается константностью ссылки на нее. Или сделать константные поля, инициализирующиеся в конструкторе. Возьмем класс std::string. у него есть геттеры, типа size(). Но они не возвращают значение внутреннего поля, они возвращают размер строки. Это большая разница. Да, размер строки может быть записан во внутреннем поле и size вернет это значение, но для потребителя интерфейса это неважно. Его интересует размер строки, а не содержимое поля. std::string предоставляет геттер data(). Дата возвращает указатель на последовательное расположение символов строки. И, скорее всего, этот указатель будет указывать память, в которой строка хранит свои символы. Но потребителю строки не нужен указатель на эту память. Ему нужен указатель на символы строки. Поэтому геттеры и сеттеры у класса - это не способ записать/прочитать значение в поле объекта. Это способ повлиять на состояние или выяснить текущее состояние объекта. Только так нужно об этом думать. А в таком случае - прямой доступ к полю допустим в частном случае реализации, которая может измениться и интерфейс придется поменять. Потребители интерфейса не обрадуются :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 07:19 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbkealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь?да Вот, например, ты объявил класс, его реалиация ушла в dll. Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 07:53 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
alex_kТолько так нужно об этом думать.Ну вот не согласен. Так нужно думать, но это 100% случаев. Это был бы идеальный вариант, как телевизор: нажал одну кнопку, внутри произошло N невидимых процессов, телевизор включился, переключился на последний используемый канал, включил последнюю используемую громкость, и так далее. И всё одним простым методом. Это идеальный вариант, для совсем конечного пользователя. Программер, который делает пульт от телевизора, должен иметь больше прямого доступа к телевизору. А программер, который делает точку ИК-приёмника и обработку - ещё больше. И так далее. Или вот ещё пример, делаю я игру с N объектов. Чтобы объект двигался, мне надо сделать функцию Go(), к примеру, внутрь класса засунуть x, y, z чтобы их никто не видел. Ок. Но тут мне надо посчитать коллизии, чтобы повлиять на движение. Если это объекты одного класса, то всё ок, а если разных? Тогда надо кому-то делать GetX, GetY, GetZ, потому что по всем координатам разные проверки. А если объект словил пулю другого класса? А если объект нашёл что-то, тоже другого класса? А если ветер (другого класса) подул - мне приходится постоянно пользоваться get-ами, потом set-ами. Это всё правильно по науке. Но вот, например, с учётом того, что в Debug версии нет inline - оно всё будет тормозить, а ещё мне тяжко будет в IDE во внутреннем цикле обработки мышкой быстро глянуть значение переменных - надо будет сначала залезть в QuickWatch самого объекта, потом по иерархии долго шарить в поисках нужных для просмотра переменных... Не, я, конечно, утрирую, таких доступов к переменным бывает немного, но если в классе самих переменных много, много условных обработок - получается много кода на set/get. Вот пыль на телевизоре - она связана с телевизором, но стереть её может кто угодно, без использования set. В случае переноса телевизора - пыль перенесётся вместе с ним. Количество пыли самим телевизором никак не ограничивается(нет set с проверками), но собирает пыль на себя именно телевизор, т.е. нельзя сказать, что пыль связана с каким-то другим классом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 08:13 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени.Ага, ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 08:16 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbrdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 09:04 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devCEMbпропущено... О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.а я вот насчёт виртуальных методов не совсем согласен, статические лучше. Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нету ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 17:33 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше. Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 17:44 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devkealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше. Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно.прекрасно понимаю, в этом вырождении как раз и вся прелесть а то что хидеры больше - нет, суммарно меньше, так как наследований нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 18:01 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devРечь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса. Непонятно почему именно виртуальные методы интерфейсного класса, когда можно и PImpl'ом обойтись. Но тут всё на вкус и цвет. Библиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов. Например, считается дурной практикой выставлять контейнеры STL в интерфейсы. API в C стиле до сих пор является статусом-кво стабильности ABI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 18:07 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
NekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь: 1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.; 2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций; 3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 19:38 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devNekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь: 1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.; 2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций; 3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах. По-видимому, у тебя там какая-то своя атмосфера из частной практики. Видимо, мы о разных вещах говорим. Примерно так же реализованы драйвера БД в Qt. Спасибо, открыл мне Америку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 19:51 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2017840]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 181ms |

| 0 / 0 |
