gpt4 book ai didi

c++ - 使用 unique_ptr 的单例对象

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:01 25 4
gpt4 key购买 nike

我有下面的 CPP 源代码,用于使用 unique_ptr 创建类的单例对象:

#include <iostream>
#include <memory>

class A
{

public:
std::unique_ptr<A> getInstance(int log);
~A();

private:
static bool instanceFlag;
static std::unique_ptr<A> single;
A(int log);
int mLog;
};

bool A::instanceFlag = false;
std::unique_ptr<A> A::single = NULL;

std::unique_ptr<A> A::getInstance(int log)
{
if(!instanceFlag)
{
//single = std::make_unique<A>(log);
single = std::unique_ptr<A>(new A(log));
instanceFlag = true;
return std::move(single);
}
else
{
return std::move(single);
}
}

A::A(int log) :
mLog(log)
{

std::cout << "Called A cons" << std::flush << std::endl;
}

int main()
{
std::unique_ptr<A> mA = A::getInstance(5);
}

但是当我编译代码时出现以下错误:

$ c++ -std=c++11 try2.cpp
try2.cpp: In function 'int main()':
try2.cpp:45:41: error: cannot call member function 'std::unique_ptr<A> A::getInstance(int)' without object
std::unique_ptr<A> mA = A::getInstance(5);
^

但是我的项目中有完全相同格式的代码,我得到一个错误:

Source code Line 39: single = std::make_unique<A>(log);

编译错误:

39:   required from here

single = std::make_unique<A>(log);

error: A(int log)' is private
A::A(int log) :
^

最佳答案

首先,静态问题。这:

std::unique_ptr<A> getInstance(int log);

是一个实例方法。您需要 A 的实例来调用它,但是如果不先调用此方法就无法获得 A 的实例,所以 ...

使用实例方法的原因是它们可以访问调用它们的实例。您的方法仅使用以下成员:

static bool instanceFlag;
static std::unique_ptr<A> single;

因为它们是静态的,所以不需要实例。只需将该方法也设为静态,您就可以调用它而无需先从某处获取 A


其次,逻辑问题。您的 getInstance 方法将 unique_ptr 返回给您的单个实例。 unique_ptr 的全部要点在于它的唯一:只有一个指针拥有并控制对象的生命周期。当您返回一个 unique_ptr 时,您将单例对象的所有权从单例类本身转移给调用者。您甚至明确地调用了 move 来明确表示这正在发生。

现在,在调用一次 getInstance 之后,您的单例就完全崩溃了。如果您再次调用 getInstance,单例认为它有一个实例(因为 instanceFlag),但是 unique_ptr 处于不确定状态。我们唯一可以肯定地说的是它控制A的实例。

只需将原始指针(或引用)返回到 A 而不是转移所有权。

关于c++ - 使用 unique_ptr 的单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com