Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 11.11.2018
Сообщений: 59

Перегрузка оператора приведения типа

24.04.2019, 13:45. Показов 6647. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне нужно преобразовать сущность к одномерному массиву int*() и я не понимаю как это реализовать. Если я выделяю динамическую память, то будет утечка, потому-что я её потом не очищу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Koefs
{
private:
    int first;
    int seconds;
public:
    Koefs(int x, int y)
    {
        first = x;
        seconds = y;
    }
    operator int* ();
};
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2019, 13:45
Ответы с готовыми решениями:

Прототип оператора приведения из другого типа
Каков прототип оператора приведения из другого типа? Или это надо конструктором?

Перегрузка оператора шаблонного класса в зависимости от типа
Как заставить шаблон различать тип переменной которую ему передают? Пробую определить через type_traits, но не выходит - не компилируется....

Вызов оператора приведения базового класса
Добрый день. У меня есть иерархия классов. class A: B { ... operator const char* () const; ...

32
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
24.04.2019, 15:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
А вот про оператор присваивания придется забыть.
Почему? Переопределить копирование массива для случая присваивания не самому себе и всё.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Не кажется тебе, что как-то слишком много сложностей это добавляет?
Случай с геттером - да, он более красив. Но требует добавления скобок для вызовов каждого из полей.

Добавлено через 2 минуты
И конечно же геттеры нужно вынести в public, иначе зачем они нужны такому классу. Как и поля у меня в коде.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
24.04.2019, 15:57
Цитата Сообщение от TRam_ Посмотреть сообщение
И конечно же геттеры нужно вынести в public, иначе зачем они нужны такому классу.
Ну у тебя же ссылки тоже в привате.

Цитата Сообщение от TRam_ Посмотреть сообщение
Переопределить копирование массива для случая присваивания не самому себе и всё.
Да, это пойдет.

Цитата Сообщение от TRam_ Посмотреть сообщение
Но требует добавления скобок для вызовов каждого из полей.
Разве это проблема?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.04.2019, 16:22
rat0r,
Прочитал, но не получилось выявить UB.
Был бы рад если бы ты объяснил...)

TRam_,
А зачем тогда вообще нужны такие операторы?
К тому же, где там разные типы?
По сути оператор просто возвращает указатель на int (как если бы получили его через геттер)...
А квадратные скобки просто "достают" значение с этого адреса
В классе же это поле типа int, так ведь? Вот его мы и используем...

единственное что смущает в том коде это то что адрес first используется как массив в то время как first им не является.
А с наличием проверки на паддинг разобрался (просто в мейн не посмотрел перед отправкой сообщения)
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
24.04.2019, 16:25
Цитата Сообщение от Undisputed Посмотреть сообщение
Был бы рад если бы ты объяснил
k[1] => *(k + 1)
Поведение оператора + определено для указателей на элементы одного массива.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2019, 16:32
Цитата Сообщение от Croessmah Посмотреть сообщение
Поведение оператора + определено для указателей на элементы одного массива.
UB не из-за самого +, а из-за доступа к *(k + 1).


Zero-cost геттеры. Требуют поддержки [[no_unique_address]] и offsetof для non-standard layout типов. Ну и выполнения static_assert-ов.
C++
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
#include <iostream>
#include <cstddef>
 
class Koefs
{
    int arr[2];
public:
    Koefs(int x, int y) : arr{ x, y }
    {
        static_assert(offsetof(Koefs, first) == 0);
        static_assert(offsetof(Koefs, second) == 0);
    }
    
    [[no_unique_address]] struct {
        operator int&() { return reinterpret_cast<Koefs*>(this)->arr[0]; }
    } first;
    [[no_unique_address]] struct {
        operator int&() { return reinterpret_cast<Koefs*>(this)->arr[1]; }
    } second;
};
 
int main()
{
    Koefs k(1, 2);
    return k.first + k.second;
}
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.04.2019, 16:44
Croessmah,
Так в коде же нет явного использования оператора +
Полагаю по этой причине все должно быть нормально (но это лишь мои догадки)

Но вот first не массив, поэтому возможно думаю UB, т.к мы выходим за его рамки, где теоретически могут быть всякие данные. Хотя наверное работать будет нормально, ввиду того что данные обьекта находятся в памяти смежно

Добавлено через 4 минуты
rat0r,
Теперь походу понял где стандарт намекает на UB
If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined.
Там выход за пределы range first-а
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2019, 16:47
Цитата Сообщение от Undisputed Посмотреть сообщение
Теперь походу понял
Нет.
Цитата Сообщение от Undisputed Посмотреть сообщение
If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined.
Это про переполнение целых и т.п.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.04.2019, 17:02
rat0r,
Не знаю, я открыл [expr]/4 а там это...
Буду рад если кто нибудь разложит по полочкам
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2019, 17:15
Цитата Сообщение от rat0r Посмотреть сообщение
Вследствие [expr.add]/4
...
Цитата Сообщение от Undisputed Посмотреть сообщение
я открыл [expr]/4
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.04.2019, 17:38
Undisputed,
На мое скромное мнение, там идется что-то типо о том что,
y нас есть память. Это типо огромный массив байтов.
Компилятор определяет, какие переменные нашей программы где в этом массиве расположены.
Если мы перемещаемся с помощью +/- внутри одного массива, то это гарантированно сработает.
Если нет - то в общем случае компилятор может решить что-то куда-то переставить, и + вытащит нас в неизвестно что. Поэтому UB.
Например, если компилятор выровняет 4-байтные int-ы в структурах по пределах 8 байтов, поскольку архитектура так быстрее с ними работает, но оставит массивы как есть.
Тогда k + 1 покажет на "пустые" 4 байта, не задействованные в программе.
Но не в х86? =.=
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.04.2019, 17:41
rat0r,
Моя невнимательность
Спасибо
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.04.2019, 17:41
rat0r, далеко от истины?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
25.04.2019, 08:46
Цитата Сообщение от rat0r Посмотреть сообщение
UB не из-за самого +, а из-за доступа к *(k + 1)
Да, согласен, при +1 UB будет при доступе, а не при сложении.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2019, 08:46

Перегрузка операторов приведения типов
Доброго времени суток! Возник вопрос по перегрузке оператора преобразования типа const char*. Вот пример: class Integer { public: ...

Приведения типа классов
#include &lt;iostream&gt; class Number2; class Number { public: int i; Number(int ii = 0) : i(ii) {} Number(const...

Шаблоны. Ошибка приведения типа
Пишу курсовой проект. Шаблонную сортировку по всем полям для каждого класса. template&lt;class Type&gt; void...

Неправильное приведения типа при возврате элемента из стандартного стека
Пишет ошибку &quot;invalid type convertion&quot; в строчке #9 Cur=(Node*)s.pop(); вот и собственно весь вопрос, пробовал static_cast не помогло :/ ...

Перегрузка оператора +
Не могу заставить работать перегруженный оператор + в функции CMoveByVector Point.h: #define POINT_H #include &lt;iostream&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru