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

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

24.04.2019, 13:45. Показов 6380. Ответов 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
 Аватар для FFPowerMan
2159 / 1239 / 509
Регистрация: 11.10.2018
Сообщений: 6,287
24.04.2019, 13:47
Цитата Сообщение от Евгений323 Посмотреть сообщение
то будет утечка, потому-что я её потом не очищу.
- ну так очищай, оператор delete. Для массивов еще квадратные скобки нужно ставить между словом delete и именем массива.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.04.2019, 13:49
Цитата Сообщение от Евгений323 Посмотреть сообщение
мне нужно преобразовать сущность к одномерному массиву int*() и я не понимаю как это реализовать
Какую сущность? Как должен выглядеть массив?
Типо массив должен содержать first и second?
Цитата Сообщение от Евгений323 Посмотреть сообщение
одномерному массиву int*
И да, это не массив.
Цитата Сообщение от Евгений323 Посмотреть сообщение
Если я выделяю динамическую память, то будет утечка, потому-что я её потом не очищу.
С чего вдруг?
0
 Аватар для FFPowerMan
2159 / 1239 / 509
Регистрация: 11.10.2018
Сообщений: 6,287
24.04.2019, 13:50
Какую сущность? К чему преобразовать? - Ничего не понятно.
После слова operator слово int сразу не пишется - это ошибка. Там пишется перегружаемый оператор.
0
3 / 2 / 1
Регистрация: 07.06.2015
Сообщений: 8
24.04.2019, 13:56
Возможно вам следует воспользоваться деструктором, в теле которого пропишите код для освобождения ресурсов. Любым удобным вам способом, и не переживайте за утечку памяти.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.04.2019, 13:58
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
27
#include <iostream>
#include <cstddef>
 
 
class Koefs
{
private:
    int first;
    int seconds;
public:
    Koefs(int x, int y)
    {
        first = x;
        seconds = y;
    }
    operator int *() {
        static_assert(sizeof(first) == offsetof(Koefs, seconds), "type has padding");
        return &first;
    }
};
 
 
int main()
{
    Koefs k(42, 24);
    std::cout << k[0] << ' ' << k[1];
}
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2019, 14:05
Цитата Сообщение от Croessmah Посмотреть сообщение
#include <iostream> #include <cstddef> class Koefs { private: int first; int seconds; public: Koefs(int x, int y) { first = x; seconds = y; } operator int *() { static_assert(sizeof(first) == offsetof(Koefs, seconds), "type has padding"); return &first; } }; int main() { Koefs k(42, 24); std::cout << k[0] << ' ' << k[1]; }
UB :/
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.04.2019, 14:09
rat0r, нормас
0
0 / 0 / 0
Регистрация: 11.11.2018
Сообщений: 59
24.04.2019, 14:17  [ТС]
Объясню подробнее. Сущность - коефициенты, приобразовывается к двумерному массиву. Вот момент с очисткой памяти. Как я понял будет доступно действия int *mas = A;
Мне самому прийдётся контролировать память и в итоге delete[] mas;?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.04.2019, 14:26
Евгений323, можно что-то типо
C++
1
2
static int tmp[2]{first, seconds};
return tmp;
0
0 / 0 / 0
Регистрация: 11.11.2018
Сообщений: 59
24.04.2019, 14:33  [ТС]
То есть я правильно понял, либо статические переменные, либо очищать память за собой самому, либо smart_pointers?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.04.2019, 14:45
Croessmah,
Там два инта, по идее паддинга между ними быть не должно
И ещё не понятно зачем проверять на наличие паддинга если мы все равно возвращаем адрес first?
Хоть он там будет хоть нет что изменится то?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2019, 14:57
Цитата Сообщение от Undisputed Посмотреть сообщение
Хоть он там будет хоть нет что изменится то?
С т.з. кода без UB — ничего.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.04.2019, 15:00
Цитата Сообщение от Евгений323 Посмотреть сообщение
То есть я правильно понял
Скорее всего нет.
Приведите пример использования этой конструкции в вашем коде.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
24.04.2019, 15:10
Без UB либо с дин. массивом, либо например с промежуточным классом:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class KoefsArray;
 
class Koefs
{
friend class KoefsArray;
    
private:
    int first;
    int seconds;
public:
    Koefs(int x, int y) :
        first(x),
        seconds(y)
    {
    }
};
 
 
#define KOEF_ARR_COUNT 2
 
class KoefsArray
{
private:
    int koefs_array[KOEF_ARR_COUNT];
    
public:
    KoefsArray(const Koefs &src)
    {
        koefs_array[0] = src.first;
        koefs_array[1] = src.seconds;        
    }
    
    operator int* ()
    {
           return koefs_array;
    }
};
 
int main()
{
    Koefs koef1(1, 2);
    KoefsArray koef1_arr(koef1);
    int *my_array = koef1_arr;
}
Добавлено через 8 минут
Цитата Сообщение от Евгений323 Посмотреть сообщение
Сущность - коефициенты, приобразовывается к двумерному массиву.
Лучше в качестве коэффициентов использовать указатели/ссылки на нужные int'ы в массиве. Например так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define KOEF_ARR_COUNT 2
 
class Koefs
{   
private:
    int koefs_array[KOEF_ARR_COUNT];
    
    int &first;
    int &seconds;
public:
    Koefs(int x, int y) :
        first(koefs_array[0]),
        seconds(koefs_array[1])
    {
            first = x;
            seconds = y;
    }
    
    operator int* ()
    {
           return koefs_array;
    }
};
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.04.2019, 15:17
Цитата Сообщение от TRam_ Посмотреть сообщение
Лучше в качестве коэффициентов использовать указатели/ссылки на нужные int'ы в массиве.
А зачем они в этом случае нужны? Может сразу и хранить их в массиве?

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Koefs
{
private:
    int values[2];
public:
    Koefs(int x, int y) : values{x, y}
    {  }
    operator int* ()
    {
        return values;
    }
};
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.04.2019, 15:18
rat0r,
А в следствии чего возникает UB?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
24.04.2019, 15:30
Цитата Сообщение от DrOffset Посмотреть сообщение
А зачем они в этом случае нужны?
В этом случае они могут быть нужны для удобства понимания кода, что работаем не с безликими элементами №1 и №2 массива, а с полями first и seconds (естественно не именно с такими, т.к. отличия от №1 и №2 нет вообще никаких, но с текстовыми).

Добавлено через 7 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
А в следствии чего возникает UB?
Одновременное обращение к одним и тем же ячейкам памяти как к хранящим данные разных типов. В данном случае как к class Koefs и int *.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2019, 15:38
Цитата Сообщение от Undisputed Посмотреть сообщение
А в следствии чего возникает UB?
Вследствие [expr.add]/4
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
24.04.2019, 15:41
Цитата Сообщение от TRam_ Посмотреть сообщение
В этом случае они могут быть нужны для удобства понимания кода, что работаем не с безликими элементами №1 и №2 массива, а с полями first и seconds
Тогда лучше так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Koefs
{
private:
    int values[2];
    
    int & first()  { return values[0]; }
    int & second() { return values[1]; }
    
public:
    Koefs(int x, int y) : values{x, y}
    {  }
    operator int* ()
    {
        return values;
    }
};
А твой способ обязательно выстрелит в ногу, например, вот в таком случае:
C++
1
2
3
Koefs x(1, 2);
 
Koefs y = x; // first и second в y ссылаются на x.
Для избежания этого нужно будет также написать корректный конструктор копирования, чтобы назначать верные элементы массива ссылкам.
А вот про оператор присваивания придется забыть. Ну или использовать указатели, вместо ссылок.
Не кажется тебе, что как-то слишком много сложностей это добавляет? Я уж молчу про увеличение размера класса минимум в 2 раза.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2019, 15:41
Помогаю со студенческими работами здесь

Перегрузка операторов приведения типов
Доброго времени суток! Возник вопрос по перегрузке оператора преобразования типа 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; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru