С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Можно ли создать перегрузку самого Union'a?

26.04.2015, 16:43. Показов 1090. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возник вопрос.
Можно ли создать перегрузку самого Union'a ? Т.е.:
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
struct var
{
    int ps; // pointer size
    int t; // type
    union
    {
        bool b;
        int i;
        // и так далее
        operator bool & ()
        {
            cout << "### Bool overload operator" << endl;
            return b;
        }
        // тут ещё операторы для конкретного типа
    }d;
    operator d () // ну типа обращение к union члену структуры
    {
        switch(t)
        {
        case 1:
            return d.b;
        case 2:
            return d.i;
        case 3:
            return d.d;
        case 4:
            return d.vp;
        case 5:
            return d.pc;
        case 6:
            return d.pv;
        case 7:
            return d.pi;
        default:
            return d.b;
        }
    }
};
var **v;
Типа того... (тока как это правильно сделать, если вообще можно)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.04.2015, 16:43
Ответы с готовыми решениями:

Можно ли создать объект класса с таким же именем как у самого класса?
Можно ли создать объект класса с таким же именем как у самого класса? Ну или как то обойти эту проблему?

Сортировка uniona
Нужна ваша помощь. Есть селект select to_date(NULL) as end_date, city_id as value, city_name_ukr as name from t1 where...

Как создать перегрузку operator+?
Пишу так MyClass A=&quot;asdassdasda&quot;; MyClass B=&quot;cvvdvvcvdcc&quot;; MyClass C; C=A+B; MyClass operator+(MyClass &amp;A; MyClass &amp;B;){ ...

12
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
26.04.2015, 17:30
Цитата Сообщение от Izual Посмотреть сообщение
Можно ли создать перегрузку самого Union'a ?
Можно, тип ему задай не анонимный.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
26.04.2015, 17:50  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно
Поставил Un тип.
C++
1
2
3
4
5
6
operator un ()
    {
        switch(t)
        {
        case 1:
            return d.b;
Пишет ошибку:
Ошибка 1 error C2664: "var::un::un(const var::un &)": невозможно преобразовать аргумент 1 из "bool" в "const var::un &"
Как правильно синтаксис оформить? =)

Добавлено через 2 минуты
+ ошибка там же
9 IntelliSense: не существует подходящего конструктора для преобразования из "bool" в "var::un"
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
26.04.2015, 19:00
Цитата Сообщение от Izual Посмотреть сообщение
не существует подходящего конструктора для преобразования из "bool" в "var::un"
Ну так сделай его, конструктор-то
Цитата Сообщение от Izual Посмотреть сообщение
error C2664: "var::un::un(const var::un &)": невозможно преобразовать аргумент 1 из "bool" в "const var::un &"
Это одна и та же ошибка. Чтобы можно было преобразовать в юнион, нужен соответствующий конструктор. Сделай его. Для каждого типа, который требуется.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
26.04.2015, 23:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Чтобы можно было преобразовать в юнион
Что то я не догоняю, разве уже существующие операторы типов не сработают?

И вообще:
Представление о конструкторе

Конструктор представляет собой специальную функцию, которую C++ автоматически вызывает каждый раз при создании объекта.
Что то вообще не понятно что это, зачем это и куда пихать...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
26.04.2015, 23:14
Цитата Сообщение от Izual Посмотреть сообщение
Что то я не догоняю, разве уже существующие операторы типов не сработают?
Они работают, когда у нас есть объект. А сейчас у нас его нет, ты же его (объект) пытаешься сделать заново. Поэтому нужен конструктор.
Я все жду, правда, когда ты осознаешь, что тебе это никак не поможет.
И вообще, проще сделать вот так и эффект будет тем же, зато без switch, конструкторов и т.п.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct var
{
    int ps; // pointer size
    int t; // type
    union Un
    {
        bool b;
        int i;
        // и так далее
        operator bool & ()
        {
            cout << "### Bool overload operator" << endl;
            return b;
        }
        // тут ещё операторы для конкретного типа
    }d;
    operator Un &()
    {
        return d;
    }
};
var **v;
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
26.04.2015, 23:26  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Я все жду, правда, когда ты осознаешь, что тебе это никак не поможет.
Для того чтобы осознать надо инструкцию прочесть. К сожалению С++ настолько большой, и так быстро в нём добавляются все эти новшества, что инструкций для их применения сложно найти. Я вот пол дня гуглил фразу "conversion constructor" и максимум что находится, так это пару описаний для встроенных функций в классах(но это же совершенно не то что мне надо).
Почему же это не поможет. Одно дело свич, где согласно типу(переменная t) возвращялась бы переменная uniona, та которая нужна. (т.е. это получилось бы подобие приведения типа, т.к. моя задача если совсем просто не углубляясь решалась привидением типа)
Цитата Сообщение от DrOffset Посмотреть сообщение
А сейчас у нас его нет, ты же его (объект) пытаешься сделать заново.
Как это объекта нет? Он есть, он объявлен и заполнен NULL, а вот результат функции должен NULL заменить на какое то значение.

Или не так? =)
Я знаю что ты знаеш как сделать, но всё наверно хочеш чтоб я пошёл классы учить ^^ (практически анрил, мне нравятся другие задачки, которые вот хотелось бы уже начать решать, вот как только с функциями разберусь, можно будет и начать, дожить бы до этого момента^^)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
26.04.2015, 23:43
Цитата Сообщение от Izual Посмотреть сообщение
Как это объекта нет?
Ну ты написал оператор преобразования так, что требуешь создания нового объекта типа Un на основе значения объекта-члена структуры (ты этот объект назвал d). Т.е. компилятор делает то, что ты ему говоришь. И твой первоначальный код с switch требует создания нового объекта, а для этого нужны конструкторы.
Но даже если ты сейчас их напишешь, то это ровным счетом ничего не решит. Потому что информация о верном типе все равно не будет видна снаружи. А это то, что ты хочешь сделать, как я понял.
Цитата Сообщение от Izual Посмотреть сообщение
Почему же это не поможет.
Потому что тот юнион, который ты получишь этим оператором приведения, ничем по поведению своему не будет отличаться от d. Т.е. это тоже самое. С таким же успехом можно пользоваться d сразу (так, как я показал в посте №32).
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.04.2015, 01:19  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
не будет видна снаружи
const_cast не виден? (на каждый тип, как возврат из var.t в статическом описании ~20 перенаправлений*)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.04.2015, 08:14
Цитата Сообщение от Izual Посмотреть сообщение
const_cast не виден?
Причем тут вообще const_cast?
В общем, пробуй сам, как дойдешь до этого - скажешь
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.04.2015, 13:26  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Причем тут вообще const_cast?
Ну самым простым способом решается моя проблема привидением типа, cast приводит тип, если бы его можно было использовать в паре с шаблоном для приведения относительно var.t определённый тип, то можно было бы... (ну чисто логически, а практически я не знаю можно ли)
Цитата Сообщение от DrOffset Посмотреть сообщение
как дойдешь
Скажи как обращяться из вложенной функции в unione к структурному (родителя) члену t ? Что то у меня не получается зависимость указать, ругается на t =(
C++
1
2
3
4
5
6
7
8
9
10
un GetVar()
        {
            switch (t)
            {
            case 1:
                return b;
            default:
                return i;
            }
        }
Добавлено через 4 часа 29 минут
Как грубый вариант, думаю в шаблон передать сразу структуру, а потом уже с юнионами танцевать по variadic, а исходя из типа возврата делать static_cast (в моём примере это прокатило, посмотрим что с другими будет, а то это придётся все переменные кастовать)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.04.2015, 19:45
Цитата Сообщение от Izual Посмотреть сообщение
Ну самым простым способом решается моя проблема привидением типа, cast приводит тип, если бы его можно было использовать в паре с шаблоном для приведения относительно var.t определённый тип, то можно было бы... (ну чисто логически, а практически я не знаю можно ли)
Чисто логически const_cast снимает\навешивает константность. Он типы не приводит. Может быть ты какой другой каст имел в виду?

Цитата Сообщение от Izual Посмотреть сообщение
Скажи как обращяться из вложенной функции в unione к структурному (родителя) члену t ? Что то у меня не получается зависимость указать, ругается на t =(
Напрямую никак.
Делай GetVar членом структуры, если нужен доступ к t.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.04.2015, 22:54  [ТС]
Чуть модификаций...
Добавил Операторы для возврата значений (для "реальных" типов) внутрь union'а...
C++
1
2
3
4
5
6
un &operator =(double vd)
        {
            d = vd;
            cout << "### Returned <double> overload operator" << endl; 
            return *this;
        }
Теперь строка теста правильно срабатывает.
C++
1
 v[1][2].d = atof(v[1][3].d);
Цитата Сообщение от DrOffset Посмотреть сообщение
Может быть ты какой другой каст имел в виду?
static_cast =) Я ещё в предыдущем посте поправил..

Цитата Сообщение от DrOffset Посмотреть сообщение
Делай GetVar членом структуры, если нужен доступ к t.
Что то я всё никак этот конструктор не понимаю как сделать, покажи на одном примере плз)

Добавлено через 1 час 43 минуты
*вроде нашёл..

C++
1
2
Money() : amount{ 0.0 } {};
    explicit Money(double _amount) : amount{ _amount } {};
Пошёл ставить)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2015, 22:54
Помогаю со студенческими работами здесь

Для какого оператора можно выполнить перегрузку еще раз
Всем привет. Ребят, подскажите... Сдавал контрольную по классам.. нужно было сделать перегрузку для операторов ++,-- и бинарный +, но...

Выполнить перегрузку, именно для этого условия и как можно проще
Помогите пожалуйста! Если можно, то как можно проще... Написать функцию min с переменным числом параметров, которая находит минимальное из...

Создать 2 объекта a и b, разработанного класса – символьная строка, реализовать перегрузку операции >=
Нужно написать прогу, сам пытался но не смог. (желательно с обьяснением) Заранее спасибо! Создать 2 объекта a и b, разработанного...

Создать класс, реализующий перегрузку операторов, разработать оконное приложение для работы с методами класса
Помоготите кто может)))пожалуйста) Цель работы: Познакомиться с принципами перегрузки операторов в ЯП С#. Создать класс, реализующий...

Можно ли сослаться на самого себя?
Вопрос на засыпку, есть форма 'frm1', в которой есть список lst1, чтобы он делал какое-то действие по изменению (событие onchange) я пишу...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru