使用 unique_ptr 保证工厂中的唯一对象
Guarantee Unique objects in factory using unique_ptr
我遇到了以下工厂代码。
T::create(std::forward<Args>(args)...)
returns 指向动态创建的对象的指针。所以基本上,如果两个对象具有相同的地址,那么它们就是相同的。
unique_ptr
保证单个 unique_ptr
容器拥有持有指针的所有权。这意味着您无法复制 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>
的 "uniqueness" 倒过来了。没有一种神奇的机制可以在您创建 std::unique_ptr<T>
时以某种方式检查所有当前存在的 std::unique_ptr<T>
并在拥有相同指针值的情况下执行不同的操作。
相反,假定您之前已经 new
编辑了一个 T *
并从中构造了一个 std::unique_ptr<T>
,或者调用 std::make_unique<T>
到 new
a T
并为您将其包装在 unique_ptr<T>
中。如果该假设不是这种情况,并且 std::unique_ptr<T>
被破坏,则您的程序的行为是未定义的。
禁止复制然后向您保证 delete
被调用 恰好一次 ,并且您通常不需要额外的努力(即指针的生命周期恰好是与指针的生命周期相同)
我遇到了以下工厂代码。
T::create(std::forward<Args>(args)...)
returns 指向动态创建的对象的指针。所以基本上,如果两个对象具有相同的地址,那么它们就是相同的。unique_ptr
保证单个unique_ptr
容器拥有持有指针的所有权。这意味着您无法复制 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>
的 "uniqueness" 倒过来了。没有一种神奇的机制可以在您创建 std::unique_ptr<T>
时以某种方式检查所有当前存在的 std::unique_ptr<T>
并在拥有相同指针值的情况下执行不同的操作。
相反,假定您之前已经 new
编辑了一个 T *
并从中构造了一个 std::unique_ptr<T>
,或者调用 std::make_unique<T>
到 new
a T
并为您将其包装在 unique_ptr<T>
中。如果该假设不是这种情况,并且 std::unique_ptr<T>
被破坏,则您的程序的行为是未定义的。
禁止复制然后向您保证 delete
被调用 恰好一次 ,并且您通常不需要额外的努力(即指针的生命周期恰好是与指针的生命周期相同)