Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
#1

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

26.04.2015, 16:43. Просмотров 242. Ответов 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;
Типа того... (тока как это правильно сделать, если вообще можно)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2015, 16:43     Можно ли создать перегрузку самого Union'a?
Посмотрите здесь:
C++ Как создать перегрузку operator+?
Выполнить перегрузку, именно для этого условия и как можно проще C++
Можно ли заменить обращение к Union без указания типа переменной? C++
Создать 2 объекта a и b, разработанного класса – символьная строка, реализовать перегрузку операции >= C++
Создать класс "Дата" с конструкторами, деструктором, указанными методами. Выполнить перегрузку указанных операторов C++
Можно ли заставить класс записывать самого себя в файл? C++
Можно ли удалить объект экземпляра класса из самого себя? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6911 / 4104 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
26.04.2015, 17:30     Можно ли создать перегрузку самого Union'a? #2
Цитата Сообщение от Izual Посмотреть сообщение
Можно ли создать перегрузку самого Union'a ?
Можно, тип ему задай не анонимный.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
26.04.2015, 17:50  [ТС]     Можно ли создать перегрузку самого Union'a? #3
Цитата Сообщение от 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"
DrOffset
6911 / 4104 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
26.04.2015, 19:00     Можно ли создать перегрузку самого Union'a? #4
Цитата Сообщение от Izual Посмотреть сообщение
не существует подходящего конструктора для преобразования из "bool" в "var::un"
Ну так сделай его, конструктор-то
Цитата Сообщение от Izual Посмотреть сообщение
error C2664: "var::un::un(const var::un &)": невозможно преобразовать аргумент 1 из "bool" в "const var::un &"
Это одна и та же ошибка. Чтобы можно было преобразовать в юнион, нужен соответствующий конструктор. Сделай его. Для каждого типа, который требуется.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
26.04.2015, 23:05  [ТС]     Можно ли создать перегрузку самого Union'a? #5
Цитата Сообщение от DrOffset Посмотреть сообщение
Чтобы можно было преобразовать в юнион
Что то я не догоняю, разве уже существующие операторы типов не сработают?

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

Конструктор представляет собой специальную функцию, которую C++ автоматически вызывает каждый раз при создании объекта.
Что то вообще не понятно что это, зачем это и куда пихать...
DrOffset
6911 / 4104 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
26.04.2015, 23:14     Можно ли создать перегрузку самого Union'a? #6
Цитата Сообщение от 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;
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
26.04.2015, 23:26  [ТС]     Можно ли создать перегрузку самого Union'a? #7
Цитата Сообщение от DrOffset Посмотреть сообщение
Я все жду, правда, когда ты осознаешь, что тебе это никак не поможет.
Для того чтобы осознать надо инструкцию прочесть. К сожалению С++ настолько большой, и так быстро в нём добавляются все эти новшества, что инструкций для их применения сложно найти. Я вот пол дня гуглил фразу "conversion constructor" и максимум что находится, так это пару описаний для встроенных функций в классах(но это же совершенно не то что мне надо).
Почему же это не поможет. Одно дело свич, где согласно типу(переменная t) возвращялась бы переменная uniona, та которая нужна. (т.е. это получилось бы подобие приведения типа, т.к. моя задача если совсем просто не углубляясь решалась привидением типа)
Цитата Сообщение от DrOffset Посмотреть сообщение
А сейчас у нас его нет, ты же его (объект) пытаешься сделать заново.
Как это объекта нет? Он есть, он объявлен и заполнен NULL, а вот результат функции должен NULL заменить на какое то значение.

Или не так? =)
Я знаю что ты знаеш как сделать, но всё наверно хочеш чтоб я пошёл классы учить ^^ (практически анрил, мне нравятся другие задачки, которые вот хотелось бы уже начать решать, вот как только с функциями разберусь, можно будет и начать, дожить бы до этого момента^^)
DrOffset
6911 / 4104 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
26.04.2015, 23:43     Можно ли создать перегрузку самого Union'a? #8
Цитата Сообщение от Izual Посмотреть сообщение
Как это объекта нет?
Ну ты написал оператор преобразования так, что требуешь создания нового объекта типа Un на основе значения объекта-члена структуры (ты этот объект назвал d). Т.е. компилятор делает то, что ты ему говоришь. И твой первоначальный код с switch требует создания нового объекта, а для этого нужны конструкторы.
Но даже если ты сейчас их напишешь, то это ровным счетом ничего не решит. Потому что информация о верном типе все равно не будет видна снаружи. А это то, что ты хочешь сделать, как я понял.
Цитата Сообщение от Izual Посмотреть сообщение
Почему же это не поможет.
Потому что тот юнион, который ты получишь этим оператором приведения, ничем по поведению своему не будет отличаться от d. Т.е. это тоже самое. С таким же успехом можно пользоваться d сразу (так, как я показал в посте №32).
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
27.04.2015, 01:19  [ТС]     Можно ли создать перегрузку самого Union'a? #9
Цитата Сообщение от DrOffset Посмотреть сообщение
не будет видна снаружи
const_cast не виден? (на каждый тип, как возврат из var.t в статическом описании ~20 перенаправлений*)
DrOffset
6911 / 4104 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
27.04.2015, 08:14     Можно ли создать перегрузку самого Union'a? #10
Цитата Сообщение от Izual Посмотреть сообщение
const_cast не виден?
Причем тут вообще const_cast?
В общем, пробуй сам, как дойдешь до этого - скажешь
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
27.04.2015, 13:26  [ТС]     Можно ли создать перегрузку самого Union'a? #11
Цитата Сообщение от 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 (в моём примере это прокатило, посмотрим что с другими будет, а то это придётся все переменные кастовать)
DrOffset
6911 / 4104 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
27.04.2015, 19:45     Можно ли создать перегрузку самого Union'a? #12
Цитата Сообщение от Izual Посмотреть сообщение
Ну самым простым способом решается моя проблема привидением типа, cast приводит тип, если бы его можно было использовать в паре с шаблоном для приведения относительно var.t определённый тип, то можно было бы... (ну чисто логически, а практически я не знаю можно ли)
Чисто логически const_cast снимает\навешивает константность. Он типы не приводит. Может быть ты какой другой каст имел в виду?

Цитата Сообщение от Izual Посмотреть сообщение
Скажи как обращяться из вложенной функции в unione к структурному (родителя) члену t ? Что то у меня не получается зависимость указать, ругается на t =(
Напрямую никак.
Делай GetVar членом структуры, если нужен доступ к t.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2015, 22:54     Можно ли создать перегрузку самого Union'a?
Еще ссылки по теме:
Найти площадь самого большого треугольника. Каким образом можно использовать 1 цикл? C++
Создать программу нахождения самого длинного слова в текстовом файле. C++ Builder
Определить координаты самого нижнего и самого правого из отрицательных элементов матрицы C++
C++ Число. Вывести только цифры самого младшего и самого старшего разряда
C++ Вывод из вектора самого короткого и самого длинного string значения

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

Или воспользуйтесь поиском по форуму:
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
27.04.2015, 22:54  [ТС]     Можно ли создать перегрузку самого Union'a? #13
Чуть модификаций...
Добавил Операторы для возврата значений (для "реальных" типов) внутрь 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 } {};
Пошёл ставить)
Yandex
Объявления
27.04.2015, 22:54     Можно ли создать перегрузку самого Union'a?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru