C++类对象的两次调用构造函数初始化问题

chuwen 2017-10-22 02:12:43
定义了一个类JOB.
然后定义了一个全局实例并且将其初始化,static JOB A(a, b, c, d);
然后在CLASS的某个PUBLIC函数里面,实现对实例A的第二次初始化,因为初始化值需要改变。
CLASS::setnew(){
new (&A) JOB(e,f,g,h);
}
我试了一下,程序可以运行,但是不知道这种两次调用构造函数初始化的方法有没有什么潜在的问题?
有没有什么更好的方案实现那个类实例的第二次初始化。谢谢。
...全文
983 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuwen 2017-11-13
  • 打赏
  • 举报
回复
引用 7 楼 paschen的回复:
引用 6 楼 chuwen 的回复:
[quote=引用 5 楼 paschen 的回复:]你这里调用的是placement new,但你需要先析构原对象,再重新构造新的对象。一种更好的解决方法就是直接使用原来的对象,直接为需要修改的成员变量重新赋值即可
谢谢回复。主要是我现在碰到编译错误,说不能给READ-ONLY变量赋值,目前不知道原因出在哪里。比如在那个PUBLIC函数里, 我使用了如下赋值:DATA.x=e;DATA.y=f;z=g;z1=h;然后编译,给我报了四个错误,都是不能给READ-ONLY变量赋值。但是我用PLACEMENT NEW那种重新调用构造函数就可以运行,不过我看百度上很多人都是PLACEMENT NEW这种用法不值得推荐,所以现在很疑惑。
应该不会,可以直接赋值的,你的成员是变量是否定义成了常量,或者赋值的函数是常量成员函数[/quote] 哈喽,你好,还想就这个问题请教一下您。现在的情况是成员变量是常量,所以不能直接赋值,那这样的话,我能用placement new方法先析构,再调用构造函数二次初始化吗?如果可以,这种方法会不会有潜在的危险性??我搜百度,好像有人说有危险性。像这种二次初始化的需求。有没有更好的解决方案。然后,什么情况下定义一个类对象不用初始化,我在想,要是第一次定义类对象的时候不初始化,那就等成员变量值更新后,直接调用构造函数初始化。
paschen 版主 2017-10-22
  • 打赏
  • 举报
回复
引用 6 楼 chuwen 的回复:
引用 5 楼 paschen 的回复:
你这里调用的是placement new,但你需要先析构原对象,再重新构造新的对象。一种更好的解决方法就是直接使用原来的对象,直接为需要修改的成员变量重新赋值即可
谢谢回复。主要是我现在碰到编译错误,说不能给READ-ONLY变量赋值,目前不知道原因出在哪里。比如在那个PUBLIC函数里, 我使用了如下赋值:DATA.x=e;DATA.y=f;z=g;z1=h;然后编译,给我报了四个错误,都是不能给READ-ONLY变量赋值。但是我用PLACEMENT NEW那种重新调用构造函数就可以运行,不过我看百度上很多人都是PLACEMENT NEW这种用法不值得推荐,所以现在很疑惑。
应该不会,可以直接赋值的,你的成员是变量是否定义成了常量,或者赋值的函数是常量成员函数
chuwen 2017-10-22
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
你这里调用的是placement new,但你需要先析构原对象,再重新构造新的对象。一种更好的解决方法就是直接使用原来的对象,直接为需要修改的成员变量重新赋值即可
谢谢回复。主要是我现在碰到编译错误,说不能给READ-ONLY变量赋值,目前不知道原因出在哪里。 比如在那个PUBLIC函数里, 我使用了如下赋值: DATA.x=e; DATA.y=f; z=g; z1=h; 然后编译,给我报了四个错误,都是不能给READ-ONLY变量赋值。 但是我用PLACEMENT NEW那种重新调用构造函数就可以运行,不过我看百度上很多人都是PLACEMENT NEW这种用法不值得推荐,所以现在很疑惑。
paschen 版主 2017-10-22
  • 打赏
  • 举报
回复
你这里调用的是placement new,但你需要先析构原对象,再重新构造新的对象。一种更好的解决方法就是直接使用原来的对象,直接为需要修改的成员变量重新赋值即可
chuwen 2017-10-22
  • 打赏
  • 举报
回复
你好,这个是static的类实例,有影响吗?另外,我有一点没说清楚。 定义了一个类JOB. 然后定义了一个全局实例并且将其初始化,static JOB A(a, b, c, d); 然后, 需要利用JOB类对象A去注册一个其他不同类的对象。 然后在CLASS的某个PUBLIC函数里面,实现对实例A的第二次初始化,因为初始化值需要改变。 CLASS::setnew(){      new (&A) JOB(e,f,g,h); }
chuwen 2017-10-22
  • 打赏
  • 举报
回复
谢谢回复。非常感谢。 我搜索网上有的写的是在第二次初始化之后再调用析构函数。有点疑惑。 请问,我两次调用构造函数初始化,是不是第二次又在那个地址空间生成了一个新对象?这是不是placement new用法? 这种方法实现类对象的第二次调用构造函数初始化会有问题吗?
xskxzr 2017-10-22
  • 打赏
  • 举报
回复
写错了,应该是A.~JOB();
引用 1 楼 xsklld 的回复:
要先析构。
CLASS::setnew() {
    A.~A();
    new (&A) JOB(e,f,g,h);
}
xskxzr 2017-10-22
  • 打赏
  • 举报
回复
要先析构。
CLASS::setnew() {
    A.~A();
    new (&A) JOB(e,f,g,h);
}

64,654

社区成员

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

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