大量成员变量的结构体如何快速初始化?

LL596214569 2020-06-08 04:00:13
有一个类,里面有很多的int double boo等数值l类型成员变量,还有vector与map等容器类型的成员变量,
如何快速在构造函数内将这些成员变量初始化?一个一个的去 =0 太麻烦了
...全文
537 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-06-08
  • 打赏
  • 举报
回复
可以用联合体unio试试
for example
class AA {
public:
union{
struct {char buf[32];}; //这里用个字符数组,长度是联合体的总长度
struct {int a,b,c,d;}; //4个int是32字节(1个int8个字节)
};
AA() {
memset(buf, 0, sizeof(buf)); //这样可以方便的初始化
}
};

int main()
{
AA a;
a.a = 5; //这样可以方便的利用联合体的其他域
a.b = 4;
printf("%d, %d, %d, %d\n", a.a, a.b, a.c, a.d);
return 0;
}
  • 打赏
  • 举报
回复
c++11 定义成员变量的时候可以直接赋值,我觉得这个可以让你鱼熊掌兼得,毕竟你定义的时候赋值开销不大 class A{ A(); int a1=2; int b2=3; } A::A() { }
LL596214569 2020-06-08
  • 打赏
  • 举报
回复
引用 6 楼 sdghchj 的回复:


class Base{
public:
    Base(){
    memset(this,0,sizeof(*this))
    }
}

class Derived: public Base{

}

这样改没必要,因为在我看来这样改的话这份代码就相当于 class 肢体{ public: int 手; int 脚; Base(){ memset(this,0,sizeof(*this)) } } class 人: public 肢体{ } 虽然手脚确实是肢体,但人直接拥有手脚就行
LL596214569 2020-06-08
  • 打赏
  • 举报
回复
引用 5 楼 sdghchj 的回复:
[quote=引用 3 楼 LL596214569 的回复:][quote=引用 1 楼 sdghchj 的回复:] vector map这些都是类,有自己的默认构造函数。 主要是基本数据类型的成员,可以全部封装到一个结构体中,这种对象叫plain old data,直接用memset全部初始化为0.
从逻辑上来讲,这些变量都放在这个类上就表明我认为这些变量就是这个类的职能的一部分,所以不应该再添加一层结构用来盛装这些变量。 而要是只是为了方便初始化来添加一层结构,那在之后使用这些变量的时候就从“struct->变量”变成了“struct→XX.变量”,这样增加的工作量可能比现在在初始化里一个一个赋值增加的更多。。。。[/quote]用继承不就行了么[/quote] 鱼和熊掌能兼得当然是最好的。。。如果实在不能兼得我还是会选择在构造函数里一个一个写,暂时没打算修改类的结构。。。。。
sdghchj 2020-06-08
  • 打赏
  • 举报
回复


class Base{
public:
    Base(){
    memset(this,0,sizeof(*this))
    }
}

class Derived: public Base{

}

sdghchj 2020-06-08
  • 打赏
  • 举报
回复
引用 3 楼 LL596214569 的回复:
[quote=引用 1 楼 sdghchj 的回复:] vector map这些都是类,有自己的默认构造函数。 主要是基本数据类型的成员,可以全部封装到一个结构体中,这种对象叫plain old data,直接用memset全部初始化为0.
从逻辑上来讲,这些变量都放在这个类上就表明我认为这些变量就是这个类的职能的一部分,所以不应该再添加一层结构用来盛装这些变量。 而要是只是为了方便初始化来添加一层结构,那在之后使用这些变量的时候就从“struct->变量”变成了“struct→XX.变量”,这样增加的工作量可能比现在在初始化里一个一个赋值增加的更多。。。。[/quote]用继承不就行了么
sdghchj 2020-06-08
  • 打赏
  • 举报
回复
引用 3 楼 LL596214569 的回复:
[quote=引用 1 楼 sdghchj 的回复:] vector map这些都是类,有自己的默认构造函数。 主要是基本数据类型的成员,可以全部封装到一个结构体中,这种对象叫plain old data,直接用memset全部初始化为0.
从逻辑上来讲,这些变量都放在这个类上就表明我认为这些变量就是这个类的职能的一部分,所以不应该再添加一层结构用来盛装这些变量。 而要是只是为了方便初始化来添加一层结构,那在之后使用这些变量的时候就从“struct->变量”变成了“struct→XX.变量”,这样增加的工作量可能比现在在初始化里一个一个赋值增加的更多。。。。[/quote]那你是想鱼和熊掌兼得?
LL596214569 2020-06-08
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
vector map这些都是类,有自己的默认构造函数。 主要是基本数据类型的成员,可以全部封装到一个结构体中,这种对象叫plain old data,直接用memset全部初始化为0.
从逻辑上来讲,这些变量都放在这个类上就表明我认为这些变量就是这个类的职能的一部分,所以不应该再添加一层结构用来盛装这些变量。 而要是只是为了方便初始化来添加一层结构,那在之后使用这些变量的时候就从“struct->变量”变成了“struct→XX.变量”,这样增加的工作量可能比现在在初始化里一个一个赋值增加的更多。。。。
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
vector map这些都是类,有自己的默认构造函数。 主要是基本数据类型的成员,可以全部封装到一个结构体中,这种对象叫plain old data,直接用memset全部初始化为0.
千万不要把string放到struct里面memset了
sdghchj 2020-06-08
  • 打赏
  • 举报
回复
vector map这些都是类,有自己的默认构造函数。 主要是基本数据类型的成员,可以全部封装到一个结构体中,这种对象叫plain old data,直接用memset全部初始化为0.

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧