![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
__nazar__ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 4.2.2008 Репутация: нет Всего: нет |
Здраствуйте.
У меня возникла вот такая интересная ситуация при компиляции програмы: проблема в том что если о обединение входит клас то при компиляции возникает ошибка. Вот програма (написана на Visual C++): #pragma once #include <complex> #include "matrix.h" typedef class std::complex<long double> LongComplex; typedef enum EOperation {UNKNOWN,DEGREE,MUL,DIVD,AND,OR,XOR,NOT,DIV,MOD,PL US,MINUS} OPERATION; typedef enum ESwitcher {EMPTY,NUMBER,MATRICA,ACT} SWITCHER; typedef class CElement { public: SWITCHER GetElementType() {return sw;}; LongComplex& GetNumber(); OPERATION& GetOperation(); MATRIX& GetMatrix(); void SetNumber(LongComplex num); void SetOperation(OPERATION n); void SetMatrix(MATRIX& m); void Clear(); private: union { LongComplex number; OPERATION op; MATRIX matr; }element; SWITCHER sw; } ELEMENT,* PELEMENT; А вот ошибка error C2620: member 'CElement::number' of union 'CElement::<unnamed-tag>' has user-defined constructor or non-trivial default constructor. Но самое удивительное, то что MATRIX тоже класс но он ошибки не видайот потому что имеет конструктор и деструктор по умолчанию (то есть вобще их не имеет). Что можете посоветовать. как решыть ету проблему (обединение нужно использовать обязательно)? |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
__nazar__ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 4.2.2008 Репутация: нет Всего: нет |
так что мне делать, не переписывать же стандартну библиотеку
![]() Добавлено через 3 минуты и 39 секунд В принципе я зделал так: #pragma once #include <complex> #include "matrix.h" typedef class std::complex<long double> LongComplex; typedef enum EOperation {UNKNOWN,DEGREE,MUL,DIVD,AND,OR,XOR,NOT,DIV,MOD,PLUS,MINUS} OPERATION; typedef enum ESwitcher {EMPTY,NUMBER,MATRICA,ACT} SWITCHER; typedef class CElement { public: SWITCHER GetElementType() {return sw;}; LongComplex& GetNumber(); OPERATION& GetOperation(); MATRIX& GetMatrix(); void SetNumber(LongComplex num); void SetOperation(OPERATION n); void SetMatrix(MATRIX& m); void Clear(); private: /* union { LongComplex number; OPERATION op; MATRIX matr; }element;*/ char element[sizeof(LongComplex)]; SWITCHER sw; } ELEMENT,* PELEMENT; потом просто преобразовую типы, просто интересно может есть какие-то другие способи? |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
можно, например, использовать указатели в объединение, вместо самих объектов.
|
|||
|
||||
__nazar__ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 4.2.2008 Репутация: нет Всего: нет |
тогда и що 4 байта на каждий указатель
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
__nazar__, в union будет выделено памяти только под элемент максимального размера. Т.е. если у тебя внутри union будет 3 указателя, то памяти будет выделено под объединения всего sizeof(void*).
Объекты в union не должны иметь пользовательских конструкторов (и конструируемых полей), так как это может привести к порче данных одного объекта конструктором другого. |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Boost.variant. или boost.anytype. Лично мне первый больше нравится. И чо? Это сообщение отредактировал(а) Mayk - 11.3.2008, 06:37 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
как вариант, вместо union-а можно использовать размещающее конструирование, забить буфер достаточной длины, и размещать там что угодно)), а вообще, конечно лучше boost::any, но any использует динамическую память...
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Не используй union. Это наследие C и с классами плохо смешивается. Даже если держать там только указатели, нужно писать поддержку нормального создания \ освобождения, иначе получится небезопасно.
А когда ты все это напишешь как следует, то получишь что-то вроде бустовских оболочек, только хуже. Так что согласна с Mayk: boost::variant. Mayk, у any и variant просто разные области применения. Там где нужен именно any, variant ужасно неудобно использовать - и наоборот. Но у аффтора явно случай variant - строго заданный набор типов. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |