Инициализация структуры С и в С++

179
25 марта 2022, 17:20

Есть структура вида

   typedef struct struct_name {
      struct another_struct_name {
         typefield1 field1;
         typefield2 field2;
      } const * field_name;
   } struct_name_t;
   typedef struct another_struct_name another_struct_name_t;

В Си данную структуру инициализирую например так

const another_struct_name_t some_an_s = {
   .field1 = value1,
   .field2 = value2 
}; 
const struct_name_t name = { .field_name = &some_an_s };

Всё работает... однако, на С++ аналогичная конструкция

const struct_name_t name = {&some_an_s}; 

a value of type "const struct_name_t *" cannot be used to initialize an entity of type "const struct_name::another_struct_name *"

Если так

struct another_struct_name const* temp = {&some_an_s};
const struct_name_t name = {temp}; 

аналогичная ошибка. Как проинициализировать данную структуру правильно в С++?

Answer 1

Дело в том, что в С++ класс another_struct_name будет вложенным в класс struct_name, а не помещаться в глобальное пространство имен, как в С. Так что этот код уже не будет работать на выражении const another_struct_name_t some_an_s. Чтобы объявления можно было нормально использовать и в С, и в С++ вам надо избавиться от вложенных структур. А вот designated initializers можно оставить - они будут официально поддерживаться в С++20 и во многих компиляторах реализованы уже сейчас.

typedef struct another_struct_name another_struct_name_t;
struct another_struct_name
{
    int field1;
    int field2;
};
typedef struct struct_name struct_name_t;
struct struct_name
{
    another_struct_name_t const * field_name;
};
another_struct_name_t const some_an_s{.field1{3}, .field2{4}}; 
struct_name_t const name{.field_name{&some_an_s}};

online compiler

Answer 2

В С++ уже можно не дергаться со всеми этими typedef.

struct struct_name {
    struct another_struct_name {
        typefield1 field1;
        typefield2 field2;
    } const * field_name;
};
struct_name::another_struct_name some_an_s{value1, value2};
struct_name name{&some_an_s};

Примерно так (не компилировал за отсутствием typefield, например).

Только меня как минимум все же смущает создание объекта вложенной структуры за пределами охватывающего объекта... Не С++'ный подход.

READ ALSO
Считывание нажатия на клавиатуру

Считывание нажатия на клавиатуру

Как можно считать нажатие клавиши за одно, а не в стандартной форме: сигнал - пауза - сигнал (пока происходит нажатие)?

130
Хранение абстрактного типа в stl::vector C++ [дубликат]

Хранение абстрактного типа в stl::vector C++ [дубликат]

Пытаюсь хранить в контейнере абстрактный тип "Weapon", но возникает ошибкаКод:

106
MySQL не записывает большой текст

MySQL не записывает большой текст

Текст (10 000+ символов) при записи в БД обрезается, записывается не весьТекст меньшего размера записывается полностью

145