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的析构
};