(Struct *) Инициализация с использованием значения атрибута name?

Я определил эту структуру:

typedef struct WHEATHER_STRUCT
{
   unsigned char packetID[1];
   unsigned char packetSize[2];
   unsigned char subPacketID[1];
   unsigned char subPacketOffset[2];
   ...
} wheather_struct;

Как я могу инициализировать эту структуру (используя конструктор или новый) доступ по имени атрибута? Например:

wheather_struct.packetID = 1;

в заключение

Я попробовал это решение, и оно работает для меня, но вы думаете, что это хороший выбор?

WHEATHER_STRUCT * wheather_struct = new WHEATHER_STRUCT();
*weather_struct->packetID = '1';

И для атрибута с плавающей точкой:

wheather_struct->floatAttribute= 111.111

2 ответа

Решение

В C++ вы можете использовать new выделить и инициализировать:

wheather_struct *p = new wheather_struct();

Обратите внимание на круглые скобки в конце - это инициализация значения - заполняет члены встроенных типов 0.

А потом:

p->packetID[0] = 1;

Вы можете добавить инициализаторы {} для ваших массивов, чтобы инициализировать их в нули, как это:

struct wheather_struct // no need for typedef in C++
{
   unsigned char packetID[1]{};
   unsigned char packetSize[2]{};
   unsigned char subPacketID[1]{};
   unsigned char subPacketOffset[2]{};
};

Тогда используйте new динамически создать объект:

auto w = new weather_struct;

w->packetID[0] = 'A';

Не забудьте удалить его позже:

delete w;

Но (намного лучше) используйте умный указатель:

auto w = std::make_unique<weather_struct>(); // will delete itself

w->packetID[0] = 'A';

// no need to delete it

Или (даже лучше) просто используйте его как объект значения (не всегда возможно):

weather_struct w; 

w.packetID[0] = 'A';
Другие вопросы по тегам