使用Unique_ptr确保工厂中的对象唯一

Guarantee Unique objects in factory using unique_ptr

本文关键字:对象 唯一 工厂 确保 Unique ptr 使用      更新时间:2023-10-16

我遇到了一个工厂的以下代码。

  • T::create(std::forward<Args>(args)...)返回一个指向动态创建的对象的指针。所以基本上,如果两个对象有相同的地址,那么它们是相同的
  • CCD_ 2保证单个CCD_。这意味着您不能复制unique_ptr

#pragma once
#include <memory>
#include <vector>
template <typename T>
class PoolFactory {
public:
template <typename... Args>
T *getInstance(Args... args) {
_createdItems.push_back(
std::unique_ptr<T>(T::create(std::forward<Args>(args)...)));
return _createdItems.back().get();
}
~PoolFactory() = default;
public:
std::vector<std::unique_ptr<T>> _createdItems;
};

问题

假设我们试图插入一个已经存在于向量中的对象。由于我们使用的是工厂,并且IF对象已经存在,我们只想检索它。包含移动语义的架构将如何保证这种行为?

解释此代码时,在此工厂中,对象由getInstance参数标识。该接口还建议调用方同时知道T及其构造函数参数,这样他们就可以自己构造T

这个工厂的唯一用途是使每个对象成为一个单例。

您需要一个映射(args...) -> object,而不是一个数组,因此首先您可以使用args...查找一个现有对象,并在该对象还不存在的情况下创建该对象。

您已经向后获得了std::unique_ptr<T>的"唯一性"。没有一种神奇的机制,当你创建一个std::unique_ptr<T>时,它会以某种方式检查所有当前存在的std::unique_ptr<T>,如果一个人拥有相同的指针值,它会做一些不同的事情。

相反,假设您之前已经new生成了T *并从中构造了std::unique_ptr<T>,或者将std::make_unique<T>new调用为T并将其封装在unique_ptr<T>中。如果不是这样的假设,并且std::unique_ptr<T>被破坏,那么程序的行为是未定义的。

禁止复制可以确保unique_ptr0只被调用一次,并且通常不需要您付出额外的努力(即指针对象的寿命与指针的寿命完全相同(