C++ (Struct*)使用属性值名称初始化?

C++ (Struct*)使用属性值名称初始化?,c++,struct,initialization,memset,C++,Struct,Initialization,Memset,我已定义此结构: typedef struct WHEATHER_STRUCT { unsigned char packetID[1]; unsigned char packetSize[2]; unsigned char subPacketID[1]; unsigned char subPacketOffset[2]; ... } wheather_struct; 如何通过属性名初始化此结构(使用构造函数或new)访问?例如: wheather_struct.p

我已定义此结构:

typedef struct WHEATHER_STRUCT
{
   unsigned char packetID[1];
   unsigned char packetSize[2];
   unsigned char subPacketID[1];
   unsigned char subPacketOffset[2];
   ...
} wheather_struct;
如何通过属性名初始化此结构(使用构造函数或new)访问?例如:

wheather_struct.packetID = 1;
最后

我尝试过这个解决方案,它对我很有效,但你认为它是一个好的选择吗

WHEATHER_STRUCT * wheather_struct = new WHEATHER_STRUCT();
*weather_struct->packetID = '1';
对于浮点属性:

wheather_struct->floatAttribute= 111.111

<>在C++中,可以使用<代码>新< /Cord>分配和初始化:

wheather_struct *p = new wheather_struct();
注意,末尾的括号-这是-用0填充内置类型的成员

然后:

p->packetID[0] = 1;

<>在C++中,可以使用<代码>新< /Cord>分配和初始化:

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

您可以向数组中添加初始值设定项
{}
,将它们初始化为零,如下所示:

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


给结构体一个适当的构造函数(或在默认值中使用类初始化器),在C++中停止使用<代码> MalOC 。“我如何使用MALOC初始化这个结构并更新这个值访问一个属性名?”“为什么你甚至使用<代码> MalOC ?使用构造函数有什么不对,而<代码>新< /COD>?为什么在C++程序中使用<代码> MALOC ?如果
WEATHER\u STRUCT
的任何成员更改为非POD类型,则
malloc
调用将不会创建对象,您现在必须查找一个难以找到的错误。好的,我不能使用new,因为该错误太长。但我用了malloc,但现在我知道这不是一个好的选择。我应该在这个例子中使用构造函数吗?好的,我不能使用new,因为struct太长了????????你知道什么是<代码>新< /COD>吗?给结构一个适当的构造函数(或者在默认值中使用类初始化器),在C++中停止使用<代码> MalOC 。“我如何使用MALOC初始化这个结构并更新这个值访问一个属性名?”“为什么你甚至使用<代码> MalOC ?使用构造函数有什么不对,而<代码>新< /COD>?为什么在C++程序中使用<代码> MALOC ?如果
WEATHER\u STRUCT
的任何成员更改为非POD类型,则
malloc
调用将不会创建对象,您现在必须查找一个难以找到的错误。好的,我不能使用new,因为该错误太长。但我用了malloc,但现在我知道这不是一个好的选择。我应该在这个例子中使用构造函数吗?好的,我不能使用new,因为struct太长了????????你知道
new
做什么吗?如果我使用这个解决方案,编译器会告诉我“表达式必须是一个L值可修改的”@JoseJimRin在哪一行?看起来我需要写*p->packetID='1',这对我很有用。@JoseJimRin
p->packetID[0]=1好的,谢谢,但是如果我有2个字节来表示一个信息。我需要把一个值设为300*p->packetID='300';是正确的选项吗?如果我使用此解决方案,编译器会告诉我“表达式必须是可修改的L值”@JoseJimRin在哪一行?似乎我需要编写*p->packetID='1',这对我很有用。@JoseJimRin
p->packetID[0]=1好的,谢谢,但是如果我有2个字节来表示一个信息。我需要把一个值设为300*p->packetID='300';是正确的选项吗?编译器不允许我在结构定义中放入括号{}。@JoseJimRin您可能需要将编译器的
C
版本设置为
C++11
或更高版本。您使用的编译器是什么?Microsoft(R)32位C/C++优化编译器版本16.XX.yyyy.ZZ80x86@JoseJimRin我想您可以在命令行中使用
/std:c++11
/std:c++latest
在结构定义中。@JoseJimRin您可能需要将编译器上的
C
版本设置为
C++11
或更高版本。您使用的编译器是什么?Microsoft(R)32位C/C++优化编译器版本16.XX.yyyy.ZZ80x86@JoseJimRin我认为您可以在命令行上使用
/std:c++11
/std:c++latest