【发布时间】:2017-05-20 17:07:56
【问题描述】:
我想使用代理设计模式来使我的对象的功能“无效”。在我的设计中,用作无效对象的 NullObject 是一个静态变量。
将 std::unique_ptr.reset 与指向静态变量的指针一起使用是解决此问题的合法方法吗?
我曾尝试在 Visual Studio 中执行此操作,并且一切正常,但是我担心 unique_ptr 析构函数以及它可能想尝试对静态变量做什么。
class Proxy : public IExtendedInterface
{
public:
Proxy(std::unique_ptr<IInterface> object)
: heldObject(std::move(object))
{}
void invalidate() override
{
heldObject.reset(&nullObject);
}
void someMethod() override
{
heldObject->someMethod();
}
private:
std::unique_ptr<IInterface> heldObject;
static NullObject nullObject;
};
class Object : public IInterface
{
public:
void someMethod() override
{
std::cout << "Called from object";
};
class NullObject : public IInterface
{
public:
void someMethod() override
{
std::cout << "Called from NullObject";
};
};
【问题讨论】:
-
在静态分配的对象上创建一个 unique_ptr 点不是一个好主意(事实上,您将进入 UB 领域)。当你想处理动态分配的东西时,你可以使用智能指针。
-
我知道,但我需要 unique_ptr 用于通过构造函数移动的动态分配对象。
-
unique_ptr 没有问题,问题是你使用那个静态分配的对象来表示指针不再使用。
-
那么我是否应该将 holdObject 和静态 nullObject 都设为 shared_ptr ?
-
我根本不相信你需要一个 nullObject。
标签: c++ c++11 smart-pointers