Копировать конструкторы, нетривиальные и анонимные союзы - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь использовать союзы в первый раз, я немного новичок в программировании.Я использую 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; }

с этим кодом зависимостискомпилирует.

...