将这种原始指针情况变成 unique_ptr?

Turning this raw pointer situation into a unique_ptr?

我有这样的代码:

ISessionUpdater* updater = nullptr;
if (eventName == "test")
    updater = new TestJSONSessionUpdater(doc);
if (eventName == "plus")
    updater = new PlusJSONSessionUpdater(doc);

if (updater)
{
    bool result = updater->update(data);
    delete updater;
    return result;
}
return false;

除了 unique_ptr 之外,还有其他方法可以做这样的事情吗?

也就是说,只有 1 次调用 update(data) 而不是执行:

if(cond)
make unique
call update
end
if(cond)
make unique
call update
end
...

unique_ptr<>有一个operator bool转换可以用来查询智能指针是否持有对象

std::unique_ptr<int> ptr;
if (ptr) // Not yet assigned
   std::cout << "This isn't printed";

因此您的代码变为

std::unique_ptr<ISessionUpdater> updater = nullptr;
if (eventName == "test")
    updater = std::make_unique<TestJSONSessionUpdater>(doc);
if (eventName == "plus")
    updater = std::make_unique<PlusJSONSessionUpdater>(doc);

if (updater) // If this smart pointer owns an object, execute the block
{
    bool result = updater->update(data);
    return result;
}
return false;

您的代码会像这样简单:

    std::unique_ptr<ISessionUpdater> updater;
    if (eventName == "test")
        updater = std::make_unique<TestJSONSessionUpdater>(doc);
    if (eventName == "plus")
        updater = std::make_unique<PlusJSONSessionUpdater>(doc);

    return updater ? updater->update(data) : false;

您可以检查 std::unique_ptr 与使用原始指针几乎相同的方法

注意使用 RAII 如何简化调用部分。

您可以使用 std::make_unique 分配一个新的 std::unique_ptr,如果旧的内部原始指针已经存在,它会销毁它。

std::unique_ptr<ISessionUpdater> updater = nullptr;
if (eventName == "test")
    updater = std::make_unique<TestJSONSessionUpdater>(doc);
if (eventName == "plus")
    updater = std::make_unique<PlusJSONSessionUpdater>(doc);

if (updater)
{
    bool result = updater->update(data);
    return result;
}
return false;