使用Unique_ptr确保工厂中的对象唯一
Guarantee Unique objects in factory using unique_ptr
我遇到了一个工厂的以下代码。
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_ptr
0只被调用一次,并且通常不需要您付出额外的努力(即指针对象的寿命与指针的寿命完全相同(
相关文章:
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 使用Unique_ptr确保工厂中的对象唯一
- 具有引用成员的结构是否具有唯一的对象表示形式
- 堆分配的对象是否存在永不为空的唯一所有者?
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 添加要映射的对象的唯一指针
- 唯一命名对象的表
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- 唯一 ptr 将所有权移动到包含对象的方法
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- 当原始指针和唯一指针都引用同一对象时,如何避免双重释放
- 将对象数组转换为指向唯一对象的指针数组
- 我如何模拟将作为唯一_ptr存储在gmock中的对象
- 使用具有唯一随机数的结构数组创建多个对象
- 确定 std::shared_ptr 是否是对对象的唯一引用
- 如何在 C++ 中插入和排序具有唯一条目的对象向量
- 唯一的指针在移动后仍然容纳对象
- 将全局对象初始化为指针是唯一成功的方法
- 具有编译器强制对象唯一所有权语义的c++类