【发布时间】:2019-01-27 07:15:04
【问题描述】:
我尝试在 C++ 中以单例模式使用unique_ptr,而不是原始指针。当我想将unique_ptr 分配给另一个时,我得到了一个错误。我尝试使用std::move 进行分配,但没有成功。代码如下:
#include <iostream>
#include <memory>
#include <list>
#include <algorithm>
#include <iterator>
#include <string>
using namespace std;
class ClientDB
{
private:
static unique_ptr<ClientDB> theDB;
ClientDB() {}
list<string> clients;
public:
~ClientDB() {}
static unique_ptr<ClientDB> getInstance()
{
if(theDB==nullptr)
theDB = make_unique<ClientDB>;
return theDB;
}
void addClient(string c) {clients.push_back(c);}
void printClients(ostream& os)
{
copy(clients.cbegin(),clients.cend(),ostream_iterator<string>{os,"\n"});
}
};
int main()
{
unique_ptr<ClientDB> db1{ClientDB::getInstance()};
db1->addClient("Mr. Schultz");
unique_ptr<ClientDB> db2{ClientDB::getInstance()};
db2->addClient("Mrs. James");
unique_ptr<ClientDB> db3{ClientDB::getInstance()};
db3->addClient("Mr. Karajan");
db1->printClients(cout);
}
我得到的错误是
error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<ClientDB>’ and ‘<unresolved overloaded function type>’)
theDB = make_unique<ClientDB>;
另一个问题是nullptr 是否可以用于unique_ptr。
【问题讨论】:
-
make_unique<ClientDB>需要被调用。make_unique<ClientDB>()。请注意,您的方法仍然无效。在保留对象所有权的同时,您不能返回 unique_ptr。 -
@StoryTeller 你是对的。这是我收到的另一个错误 `error: use of deleted function 'std::unique_ptr<_tp _dp>::unique_ptr(const std::unique_ptr<_tp _dp>&) [with _Tp = ClientDB; _Dp = std::default_delete
]' return theDB;' -
是的,这就是复制构造函数(它不存在,因为
unique_ptr想要......嗯,独一无二)。 -
基本上,
return theDB正在尝试创建unique_ptr的副本,这是被禁止的。您可以返回引用unique_ptr&或unique_ptr管理的原始指针:return theDB.get()。 -
不要使用 Singleton,如果你这样做,不要使用 unique_ptr。见stackoverflow.com/a/1008289/2466431
标签: c++ unique-ptr