c++类中实例化对象的正确方法

文章讲述了如何在C++中正确管理类对象的生命周期,避免局部作用域导致的对象销毁。通过std::shared_ptr确保对象与ClassA保持一致的生命周期,并介绍了使用impl_ptr封装功能,以支持无参数构造和等号赋值操作,方法源于ROS1源码中subscriber和publisher的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你想在类中实例化一个对象,而且随着这个类一直存在,就必须考虑这个对象的生命周期,避免超出局部作用域就被销毁了。常见错误:

ClassB.hpp:

class ClassB
{
public:
    ClassB(int a)
    {
    }
}

想在ClassA中用ClassB对象:

#include "ClassB.hpp"

class ClassA
{
public:
    ClassA(int a)
    {
        ClassB obj(a);
    }
}

这里obj实例化放在了ClassA的构造函数里,其实ClassA构造完后,obj就被销毁了!

想要obj生命周期和ClassA一样长,就需要把obj作为ClassA的一个成员变量:

#include "ClassB.hpp"

class ClassA
{
public:
    ClassA(int a)
    {
    }
private:
    ClassB obj(1);
}

但这又带来了新问题,我们希望obj的构造(初始化)是在ClassA的构造函数内进行,而不是在变量定义时就构造。这对于构造函数有参数的obj尤其重要。有两种解决方案:

一、用std::shared_ptr来实例化对象

当然你也可以直接用原始的指针,但是指针的销毁需要手动处理,所以我们这里用std::shared_ptr智能指针,其对象的析构是随着退出作用域而自动进行的。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值