Я пытаюсь использовать союзы в первый раз, я немного новичок в программировании.Я использую Qt 5.11 и у меня есть ошибки при компиляции.Я прочитал также пост о том, как определить конструктор для объединения и структуры, но я все еще не могу заставить мой код работать.
в "include.h" я определил:
// my struct n°1
struct ELEM_JCC_TO {
QPair <QString, QString> ID; // jump destination label
};
// my struct n°2, extension of n°1
struct ELEM_CALLS_TO : ELEM_JCC_TO {
int VarStackOut;
int VarStackOutSR; // exit variation with ret skipping
};
// my main structure
struct ELEMENTO_STACK {
// type of element, union selector
enum TYPE_STACK {
undef,
Oper,
Jcc,
Call,
Loop
} Type;
// anonymous union
union {
int VarStack;
struct ELEM_JCC_TO JccTo;
struct ELEM_CALLS_TO CallsTo;
struct ELEM_JCC_TO LoopTo;
};
};
затем в "main.cpp", когда я просто объявляю:
...
struct ELEMENTO_STACK El;
...
мое окно компиляции становится почти красным, и я получаю 5 ошибок компиляции и 29 проблем:
1. ... \ qlist.h: 494: ошибка: использование удаленной функции 'ELEMENTO_STACK :: ~ ELEMENTO_STACK ()', в то время как (от! = до) --to, удалить reinterpret_cast (to-> v);... include.h: 519: 'ELEMENTO_STACK :: ~ ELEMENTO_STACK ()' неявно удаляется, поскольку определение по умолчанию будет некорректно сформировано:
2. ... include.h: 533: ошибка: член объединения 'ELEMENTO_STACK :::: JccTo' с нетривиальным 'ELEM_JCC_TO :: ~ ELEM_JCC_TO ()'
и 4. аналогично 2.
5. ... \ qlist.h: 496: ошибка: использование удаленной функции 'ELEMENTO_STACK :: ~ ELEMENTO_STACK () '
Я знаю, что мне нужно иметь дело с конструкторами и правильно инициализировать все эти вещи.но я не могу понять как.Могу ли я получить подсказку, чтобы мой код работал?Большое спасибо
**** РЕДАКТИРОВАНИЕ ****
после многих попыток, я написал необходимые вещи, чтобы позволить ему делать свою работу.Основная структура 'ELEMENTO_STACK' нуждалась в конструкторе и деструкторе, определенных, например,
// default constructor
/* initialization list initializes the enum type and the union to one
of it's member, in this case to "ELEM_JCC_TO()"
ELEMENTO_STACK() : Type(undef),ELEM_JCC_TO() {}
// default destructor
~ELEMENTO_STACK() {
switch(Type) {
case TYPE_STACK::Jcc:
case TYPE_STACK::Loop:
ELEM_JCC_TO.~ELEM_JCC_TO();
break;
case TYPE_STACK::Call:
CallsTo.~ELEM_CALLS_TO();
break;
case TYPE_STACK::undef:
case TYPE_STACK::Oper:
VarStack = 0;
break;
}
Type = undef;
}
в дополнение к этому, я использовал эту структуру в QList, определенном как,
QList <struct ELEMENTO_STACK> Operaz;
и чтобыэто работало, мне нужно было добавить «конструктор копирования» и «конструктор для оператора =», где память должна быть правильно инициализирована, в соответствии с типом данных, содержащимся в объединении, например:
// default operator =
void operator = (const ELEMENTO_STACK &p) {
Type = p.Type;
switch(Type) {
case undef:
case Oper:
VarStack = p.VarStack;
break;
case Call:
/* next line is the most important, it initializes memory at
location of "CallsTo", calling it's constructor. Whitout
this initialization, copy something to unknown destination
will cause unpredictable results, and maybe segmentation fault
*/
new (&CallsTo) ELEM_CALLS_TO();
CallsTo.VarStackOut = el.CallsTo.VarStackOut;
CallsTo.VarStackOutSR = el.CallsTo.VarStackOutSR;
CallsTo.ID = el.CallsTo.ID;
break;
case Jcc:
// initializes JccTo with it's own constructor
new (&JccTo) ELEM_JCC_TO();
JccTo.ID = el.JccTo.ID;
break;
case Loop:
// initializes LoopTo with it's own constructor
new (&LoopTo) ELEM_JCC_TO();
LoopTo.ID = el.LoopTo.ID;
break;
}
}
// default copy constructor, calls "operator ="
ELEMENTO_STACK(const ELEMENTO_STACK &p) {*this = p; }
с этим кодом зависимостискомпилирует.