Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

26.04.2015, 16:43. Просмотров 267. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2015, 16:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли создать перегрузку самого Union'a? (C++):

Создать программу нахождения самого длинного слова в текстовом файле. - C++ Builder
Создать программу нахождения самого длинного слова в текстовом файле.

Верно ли, что масса самого тяжелого человека превышает массу самого легкого более, чем в 2 раза - C++ Builder
известна масса каждого человека из группы. верно ли, что масса самого тяжелого из них превышает массу самого легкого более чем в два раза.

Длина самого короткого и самого длинного слов - C++ Builder
помогите плз Дан текст. Найти длины самого короткого и самого длинного слов.

Создать программу, в которой можно создать папку - C++ Builder
Всем привет, Подскажите плиз как можно осуществить такое: 1. Есть форма1. 2. В ней мы можем создать какой-то объект с принадлежащей...

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

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

12
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
26.04.2015, 17:30 #2
Цитата Сообщение от Izual Посмотреть сообщение
Можно ли создать перегрузку самого Union'a ?
Можно, тип ему задай не анонимный.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
26.04.2015, 17:50  [ТС] #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"
0
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
26.04.2015, 19:00 #4
Цитата Сообщение от Izual Посмотреть сообщение
не существует подходящего конструктора для преобразования из "bool" в "var::un"
Ну так сделай его, конструктор-то
Цитата Сообщение от Izual Посмотреть сообщение
error C2664: "var::un::un(const var::un &)": невозможно преобразовать аргумент 1 из "bool" в "const var::un &"
Это одна и та же ошибка. Чтобы можно было преобразовать в юнион, нужен соответствующий конструктор. Сделай его. Для каждого типа, который требуется.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
26.04.2015, 23:05  [ТС] #5
Цитата Сообщение от DrOffset Посмотреть сообщение
Чтобы можно было преобразовать в юнион
Что то я не догоняю, разве уже существующие операторы типов не сработают?

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

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

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

Цитата Сообщение от Izual Посмотреть сообщение
Скажи как обращяться из вложенной функции в unione к структурному (родителя) члену t ? Что то у меня не получается зависимость указать, ругается на t =(
Напрямую никак.
Делай GetVar членом структуры, если нужен доступ к t.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
27.04.2015, 22:54  [ТС] #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 } {};
Пошёл ставить)
0
27.04.2015, 22:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2015, 22:54
Привет! Вот еще темы с ответами:

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

Создать класс "Дата" с конструкторами, деструктором, указанными методами. Выполнить перегрузку указанных операторов - C++
Создать класс Дата, с конструкторами, деструктором, установить дату, увеличить на 1 день (++), уменьшить на один день, добавить дни +=....

Можно ли заставить класс записывать самого себя в файл? - C++
то есть class A{ int q,w,e; bool Write(); }; main(){ A a1; a1.write();// и он записывает сам себя в файл, не...

Можно ли удалить объект экземпляра класса из самого себя? - C++
Привет! Допустим: class TEST { public: TEST(); ~TEST(); void DelMe() {


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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