Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> union и класы С++, помогите 
:(
    Опции темы
__nazar__
  Дата 10.3.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 тоже класс но он ошибки не видайот потому что имеет конструктор и деструктор по умолчанию (то есть вобще их не имеет).

Что можете посоветовать. как решыть ету проблему (обединение нужно использовать обязательно)?
PM MAIL   Вверх
Daevaorn
Дата 10.3.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(__nazar__ @  10.3.2008,  22:51 Найти цитируемый пост)
 имеет конструктор и деструктор по умолчанию (то есть вобще их не имеет).

Это и есть условие
PM MAIL WWW   Вверх
__nazar__
Дата 10.3.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.2.2008

Репутация: нет
Всего: нет



так что мне делать, не переписывать же стандартну библиотеку smile

Добавлено через 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;

потом просто преобразовую типы, просто интересно может есть какие-то другие способи?

PM MAIL   Вверх
korian
Дата 10.3.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



можно, например, использовать указатели в объединение, вместо самих объектов.
PM   Вверх
__nazar__
Дата 10.3.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.2.2008

Репутация: нет
Всего: нет



тогда и що 4 байта на каждий указатель
PM MAIL   Вверх
bsa
Дата 11.3.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



__nazar__, в union будет выделено памяти только под элемент максимального размера. Т.е. если у тебя внутри union будет 3 указателя, то памяти будет выделено под объединения всего sizeof(void*).
Объекты в union не должны иметь пользовательских конструкторов (и конструируемых полей), так как это может привести к порче данных одного объекта конструктором другого.
PM   Вверх
Mayk
Дата 11.3.2008, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(__nazar__ @  11.3.2008,  02:05 Найти цитируемый пост)
потом просто преобразовую типы, просто интересно может есть какие-то другие способи?

Boost.variant. или boost.anytype. Лично мне первый больше нравится.

Цитата(__nazar__ @  11.3.2008,  03:10 Найти цитируемый пост)
тогда и що 4 байта на каждий указатель 

И чо?

Это сообщение отредактировал(а) Mayk - 11.3.2008, 06:37


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Lazin
Дата 11.3.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



как вариант, вместо union-а можно использовать размещающее конструирование, забить буфер достаточной длины, и размещать там что угодно)), а вообще, конечно лучше boost::any, но any использует динамическую память...
PM MAIL Skype GTalk   Вверх
Earnest
Дата 11.3.2008, 11:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Не используй union. Это наследие C и с классами плохо смешивается. Даже если держать там только указатели, нужно писать поддержку нормального создания \ освобождения, иначе получится небезопасно.
А когда ты все это напишешь как следует, то получишь что-то вроде бустовских оболочек, только хуже. Так что согласна с Mayk: boost::variant.
 
Mayk, у any и variant просто разные области применения. Там где нужен именно any, variant ужасно неудобно использовать - и наоборот. Но у аффтора явно случай variant - строго заданный набор типов.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0832 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.