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

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

24.04.2019, 13:45. Показов 6335. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru