[modern c++] unique_ptr 对于被管理类的要求

make_unique要求被管理类的构造函数为public

make_unique要求被管理类的构造函数为public,即便make_unique在被管理类的友元类中调用,这一点在factory模式下尤其明显,如果factory类创建 unique_ptr 并返回,那么在其创建函数中不能使用 make_unique 创建 unique_ptr ,必须使用unique_ptr的构造函数。

被创建类

class ATrack : public Track {
  friend class TrackFactory;

 private:
  ATrack();   //TrackFactory 作为友元类,可以通过new来创建 ATrack 对象

};

Facroty类

std::unique_ptr<Track> TrackFactory::createTrack(Track::TrackType type) {
  switch (type) {
    case Track::TrackType::Audio: {
      //无法使用make_unique,因为make_unique要求被构造的类具备public的构造,即便是Factory是友元类也不行
      //TODO : 是否内存安全?
      return std::unique_ptr<ATrack>(new ATrack());
    } break;

    case Track::TrackType::Video: {
      //无法使用make_unique,因为make_unique要求被构造的类具备public的构造,即便是Factory是友元类也不行
      //TODO : 是否内存安全?
      return std::unique_ptr<VTrack>(new VTrack());
    } break;

    default: { } break; }
}



unique_ptr要求被管理类的析构函数必须为public

unique_ptr要求被管理类的析构函数必须为public,否则unique_ptr无法在其自己的相关函数里调用被管理类的析构函数,进而无法完成释放。

class ATrack : public Track {
  friend class TrackFactory;

 public:
  virtual ~ATrack();  //unique_ptr 要求被管理的类必须具备public的析构
};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值