|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
||||||
Оператор преобразования типа для неконстантной ссылки23.09.2023, 15:00. Показов 2035. Ответов 52
Здравствуйте. Я работаю над большим приложением, задействующим несколько сторонних библиотек. В каждой библиотеке реализован свой класс математического вектора. При этом, структуры и методы из этих библиотек в моем приложении обмениваются данными в виде этих векторов. То есть, я могу получить вектор методом из одной библиотеки, а потом передать его методу в другую библиотеку.
Для того, чтобы каждый раз не преобразовывать один вектор в другой (суть их одна и та же: три компоненты - x, y, z), я сделал класс-адаптер, в котором перегрузил операторы преобразования типа, которые могут возвращать созданные объекты-векторы из обеих библиотек по значению или по константной ссылке, все прекрасно работает. Теперь появились методы, которые хотят принимать неконстантную ссылку на вектор, и я не совсем понимаю, как мне быть. Мой адаптер выглядит примерно так:
0
|
||||||
| 23.09.2023, 15:00 | |
|
Ответы с готовыми решениями:
52
Оператор динамического преобразования типа возвращает ссылку NULL |
|
Комп_Оратор)
|
||
| 25.09.2023, 22:59 | ||
|
Вы хотите сказать что агрегация с отношением - невладение (неуправляемая агрегация), это порок? Ссылка ли, указатель ли - неважно. Всё может стать невалидным при преждевременном уничтожении цели. И что? Пока объект - цель жива, всё должно работать и UB нет. Компилятору до этого нет дела от слова - совсем.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||||||
| 25.09.2023, 23:07 | ||||||||||||
|
Добавлено через 5 минут
0
|
||||||||||||
|
Комп_Оратор)
|
||
| 25.09.2023, 23:10 | ||
|
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||
| 25.09.2023, 23:13 | |||||||
|
GCC исправно диагностирует это, кстати:
По ссылке как раз видно, что выводит чушь вроде 4.5793e-41. После добавления амперсанда все нормализуется. Так что нет, это не баг, это ваш недосмотр. Я не знаю зачем вы спорили, вероятно вы видели какой-то другой смысл в моих словах и другое место в вашем коде. Но место именно это, диагностика моими глазами и компилятором - совпадает. А также поведение нормализуется после вышеприведенных исправлений. UB как оно есть.
1
|
|||||||
|
Комп_Оратор)
|
||
| 25.09.2023, 23:14 | ||
|
Ну могли бы и раньше это сказать! Я был уверен что по ссылке принял. Щас пойду смотреть не исправится ли MinGW ![]() Тогда микросфт творит чудо. Хотя да. Это чистейшее UB. Да, теперь и из-под MinGW всё нормально вышло) Спасибо)
0
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||||||
| 25.09.2023, 23:21 | ||||||
|
Если в моем примере нет UB среди этих
reinterpret_cast<>, и вектора автора standard layout и layout compatible, то может ему подойдет, где хранить сами данные, внутри адаптора или извне, это дело 5-е.
0
|
||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||
| 25.09.2023, 23:22 | |||||
|
Я между тем максимально корректно вас поправил. И даже дал вам возможность вместо спора со мной самому ошибку найти.
1
|
|||||
|
Комп_Оратор)
|
|||
| 25.09.2023, 23:28 | |||
|
Добавлено через 2 минуты ![]() Я то думал, что предложенная мной схема (без учёта этой механической ошибки) содержит UB и сразу стал спорить. А нужно было одну строчку посмотреть.
0
|
|||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 25.09.2023, 23:36 | |||
|
Можно и два конструктора принимать каждый вектор, и операторы присваивания. И можно, как я писал, создавать внутри Адаптора место для вектора. Но суть не в этом. Суть в том, что на cppreference одним примером про *reinterpret_cast<T*>(v); и какое то размытое к ему поисание, меня просто повергли в смятение, но в drafte я пока этому подтверждения не нашел, пока.Вот пример :
1
|
|||
|
Комп_Оратор)
|
|
| 26.09.2023, 00:07 | |
|
SmallEvil, я исходил из того что vec1 и vec2 разные типы, хотя литерально они идентичны с точностью до статических методов. То есть, мой адаптер позволяет принимать любой из них, получать доступ к данным x,y,z и вызывать одноимённые статические методы. Но последние написаны разными библиотеками и их кода не видно. Вот и решил, что лучше их разделить, но юзать через адаптер как нечто родственное но не эквивалентное. Насколько это соответствует задаче, - решать ТС. Такой подход свободен от требований лайаут совместимости и более переносим с учётом будущих новых версий библиотек. Но решение несколько не компактное, хотя по ресурсам нетребовательное. Просто как вариант.
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 26.09.2023, 00:49 | ||
|
Но ведь ТС хотел не один из них, а иметь возможность преобразования к обоим типам. Может это можно достроить из ваших прокси, но я пока не вижу как.
0
|
||
|
Комп_Оратор)
|
|||
| 26.09.2023, 09:40 | |||
|
SmallEvil, оба подхода возможны. Можно и статически на шаблонах написать третий вариант. Он сможет брыкнуться во время компиляции, что является преимуществом. Но связывание интерфейса в рантайме будет потеряно. Пусть ТС смотрит и решает. Мы тут диспутируем, а он пропал.
0
|
|||
| 26.09.2023, 09:40 | |
|
Определить оператор преобразования типов из типа дробь в тип double
Оператор преобразования типа и его эквивалентные замены, поиск строки в текстовом файле , содержащей заданный
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|