|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
||||||
Оператор преобразования типа для неконстантной ссылки23.09.2023, 15:00. Показов 1857. Ответов 52
Здравствуйте. Я работаю над большим приложением, задействующим несколько сторонних библиотек. В каждой библиотеке реализован свой класс математического вектора. При этом, структуры и методы из этих библиотек в моем приложении обмениваются данными в виде этих векторов. То есть, я могу получить вектор методом из одной библиотеки, а потом передать его методу в другую библиотеку.
Для того, чтобы каждый раз не преобразовывать один вектор в другой (суть их одна и та же: три компоненты - x, y, z), я сделал класс-адаптер, в котором перегрузил операторы преобразования типа, которые могут возвращать созданные объекты-векторы из обеих библиотек по значению или по константной ссылке, все прекрасно работает. Теперь появились методы, которые хотят принимать неконстантную ссылку на вектор, и я не совсем понимаю, как мне быть. Мой адаптер выглядит примерно так:
0
|
||||||
| 23.09.2023, 15:00 | |
|
Ответы с готовыми решениями:
52
Оператор динамического преобразования типа возвращает ссылку NULL |
|
Заблокирован
|
||||||||||||
| 23.09.2023, 16:41 | ||||||||||||
Сообщение было отмечено DrOffset как решение
Решение
Так у вас нет приведения к ссылке.
Если типы совместимые, можно попробовать union.
Добавлено через 2 минуты
0
|
||||||||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 23.09.2023, 16:45 | |
|
danascully, кое-какие мысли есть, но для большей ясности хотелось бы получить законченный пример, который иллюстрирует проблему, а именно:
как вы используете адаптер, как синхронизируете значения адаптера с настоящим вектором, и т.д. чтобы можно было его у себя скомпилировать, исправить вашу проблему и отдать обратно вам, а вы точно убедились, что решение подходит именно для той ситуации, которую вы имели в виду.
0
|
|
|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
|
| 24.09.2023, 12:23 [ТС] | |
|
Здравствуйте. Отчасти не понял вашу мысль, отчасти, посмотрев на мейн, понял, что это не совсем то, что я хочу. Я хочу, чтобы можно было мой вектор-адаптер подставлять передавать в функции, которые принимают векторы из библиотек по значению и ссылке (конст и не конст). Причем, я хочу чтобы это происходило посредством неявного преобразования типов, чтобы я в классах типы полей-векторов-из-либ сменил на тип моего вектора и не пришлось сильно редачить остальной код, там где эти поля используются
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||
| 24.09.2023, 12:26 | |||
|
0
|
|||
|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
|
| 24.09.2023, 12:27 [ТС] | |
|
В процессе написания!
0
|
|
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
|||||||
| 24.09.2023, 13:09 | |||||||
Сообщение было отмечено DrOffset как решение
Решение
1
|
|||||||
|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
||||||
| 24.09.2023, 13:48 [ТС] | ||||||
|
Что ж, спустя пару часов тщетных попыток реализовать желаемый класс Adapter я пришел к следующим выводам
1) Оставить у класса Adapter возможность получать и изменять значения полей structure-like сопосбом почти наверняка не получится. 2) Идея создать в классе Adapter поля Vector1 и Vector2, чтобы при вызове оператора приведения по константой ссылке тупо заполнять их необходимыми float значениями, тоже не выгорит, ибо хочется чтобы этот оператор был константным методом. 3) Была идея сделать перечисление, которое будет сохранять, какой тип редактировался последним: float(по умолчанию), Vector1 или Vector2. Если отказаться от идей 1 и 2, то можно в начале каждого метода исходя из значения перечисления понять, какое поле соответствуюет истинному (последнему измененному) значению вектора и работать с ним.
0
|
||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||||
| 24.09.2023, 13:55 | ||||||
|
danascully, просто опишите в коде контракт использования вашего гипотетичесского адаптера.
Например, библиотека 1 принимает вектор1, например заполняет его, далее библиотека2, принимает этот вектор для модификации, но уже как вектор2, при этом изменения должны отразиться и на вектор1. Типа того
0
|
||||||
|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
|
| 24.09.2023, 13:58 [ТС] | |
|
Да, похоже на то
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||
| 24.09.2023, 14:11 | |||||||
Сообщение было отмечено danascully как решение
РешениеКликните здесь для просмотра всего текста
https://wandbox.org/permlink/GxEgEF3Y5LM7tMyd
Добавлено через 2 минуты Vector1 и Vector2 должны быть layout-compatible (типы полей и настройки выравнивания для них должны быть одинаковыми), иначе работать не будет.
2
|
|||||||
|
Заблокирован
|
|
| 24.09.2023, 14:19 | |
|
DrOffset, хм, я ведь ту же самую идею предложил.
Жаль что у ТС не хватило сил её доделать под себя.
1
|
|
|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
||||||
| 24.09.2023, 14:20 [ТС] | ||||||
|
Не понимаю, как при вызове оператора
0
|
||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||
| 24.09.2023, 14:25 | ||||
|
Добавлено через 1 минуту Добавлено через 2 минуты Хорошо заданный вопрос - это половина ответа.
3
|
||||
|
Комп_Оратор)
|
||
| 24.09.2023, 14:33 | ||
|
Ваш default конструктор заделетьте, в каждом конструкторе принимающем ссылку на соответствующий вектор, инициализируйте его указатель, а другой установите в nullptr. В операторе преобразования к соответствующему вектору верните разыменованный указатель на него, если он не равен nullptr - иначе - исключение. Для выяснения, какой вектор валиден придётся написать метод возвращающий элемент перечисления говорящий о том кто есть ху. Такое перечисление нужно написать. Это плата за желание возвращать ссылку на разные типы при преобразовании. Или ловите и обрабатывайте исключение, если не угадали) Может я не понял вопроса, но если понял, то я так увидел решение.
1
|
||
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
|
| 24.09.2023, 14:46 | |
|
DrOffset, а зачем ссылки x, y в классе адаптера? Тем более что они привязываются к ссылкам на члены одного из объектов, которые в общем случае могут не быть доступны. Можно же просто добавить get и set методы в класс адаптера, выбирающие их из какого-нибудь типа объединения. Да и сэкономить десяток байтов заодно.
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||
| 24.09.2023, 14:48 | |||||
|
0
|
|||||
|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
|
| 24.09.2023, 14:50 [ТС] | |
|
Занимался проверкой того, что мои вектора layout compatible.
В итоге мой Vector1=DirectX::SimpleMath::Vector3, Vector2=physx::PxVec3. Создание юниона как у вас в коде показало, что все работает. Буду имплементировать. Скажу про свое приложение. Это игровой движок. адаптер мне нужен, чтобы прокидывать данные из редактора сцены (DirectX) в физику (physx), и из симуляции физики в рендер-пайплайн (DirectX). Виноват, что сразу не поянсил. Большое спасибо всем знатокам!
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 24.09.2023, 14:51 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63
|
|
| 24.09.2023, 14:52 [ТС] | |
|
У моих векторов есть доступ к полям x,y,z, так что и у адаптера должен быть.
Добавлено через 25 секунд К сожалению, проект на с++17, так что is_layout_compatible не смог применить
0
|
|
| 24.09.2023, 14:52 | |
|
Помогаю со студенческими работами здесь
20
Определить оператор преобразования типов из типа дробь в тип double
Оператор преобразования типа и его эквивалентные замены, поиск строки в текстовом файле , содержащей заданный
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|