Проблема инициализации массива struct {enum; union;} - PullRequest
0 голосов
/ 16 марта 2020

У меня проблема с определением s_arr[10], который должен быть массивом объектов структуры, в то время как структура содержит перечисление и член объединения:

enum E {ENUM_A,ENUM_B};
union U {
  String s;
  char c[4];
};
struct S {
  E e;
  U u;
};

S s_arr[10];

Я пытался решить эту проблему в разных пути, но ни один из них не работал. По сути, я получаю следующую ошибку компиляции:

sketch_mar16a:13:11: error: use of deleted function 'S::S()'
 S s_arr[10];
           ^
/.../sketch_mar16a.ino:8:8: note: 'S::S()' is implicitly deleted because the default definition would be ill-formed:
 struct S {
        ^
sketch_mar16a:8:8: error: use of deleted function 'U::U()'
/.../sketch_mar16a.ino:4:7: note: 'U::U()' is implicitly deleted because the default definition would be ill-formed:
 union U {
       ^
sketch_mar16a:5:10: error: union member 'U::s' with non-trivial 'String::String(const char*)'
   String s;
          ^
sketch_mar16a:8:8: error: use of deleted function 'U::~U()'
 struct S {
        ^
/.../sketch_mar16a/sketch_mar16a.ino:4:7: note: 'U::~U()' is implicitly deleted because the default definition would be ill-formed:
 union U {
       ^
sketch_mar16a:5:10: error: union member 'U::s' with non-trivial 'String::~String()'
   String s;
          ^
sketch_mar16a:13:11: error: use of deleted function 'S::~S()'
 S s_arr[10];
           ^
/.../sketch_mar16a/sketch_mar16a.ino:8:8: note: 'S::~S()' is implicitly deleted because the default definition would be ill-formed:
 struct S {
        ^
sketch_mar16a:8:8: error: use of deleted function 'U::~U()'
/.../sketch_mar16a.ino: In function 'void __static_initialization_and_destruction_0(int, int)':
sketch_mar16a:13:3: error: use of deleted function 'S::~S()'
 S s_arr[10];
   ^
exit status 1
use of deleted function 'S::S()'

К сожалению, я не понимаю, где сообщение об ошибке пытается указать мне. Я пытался определить инициализаторы для участвующих классов, но я не знаю, как (или где) определить инициализатор для объединения.

Используя Google, я нашел только случаи, когда объединение содержит структуру, но Я не смог найти решение для моей проблемы.

Можете ли вы объяснить мне, почему «определение по умолчанию будет неправильно сформировано»? Как будет выглядеть определение по умолчанию и когда во время компиляции это произойдет? ПРИМЕЧАНИЕ: код скомпилирован для arduino uno с использованием Arduino IDE

1 Ответ

1 голос
/ 16 марта 2020

Судя по следующим сообщениям об ошибках:

sketch_mar16a:8:8: error: use of deleted function 'U::U()'
/.../sketch_mar16a.ino:4:7: note: 'U::U()' is implicitly deleted because the default definition would be ill-formed:
 union U {

и

/.../sketch_mar16a/sketch_mar16a.ino:4:7: note: 'U::~U()' is implicitly deleted because the default definition would be ill-formed:
 union U {

Наличие String s; в U является источником проблемы. Вам нужно определить конструктор по умолчанию и деструктор в U и убедиться, что вы правильно делаете в этих функциях.

Следующая упрощенная программа собирается на моем компьютере.

struct String
{
   String(char const*) {}
   ~String() {}
};

enum E {ENUM_A,ENUM_B};
union U {
   U() : s(nullptr) {}
   ~U() {}
  String s;
  char c[4];
};
struct S {
  E e;
  U u;
};

int main()
{
   S s_arr[10];
}

Вам понадобятся правильные реализации U::U() и U::~U(), чтобы ваша программа работала хорошо.

...