c++ - 唯一指针中的赋值运算符错误
问题描述
我试图unique_ptr
在 C++ 中以单例模式而不是原始指针使用。当我想将 a 分配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
.
解决方案
最后在老师的帮助下,我可以解决这个问题。有几点需要考虑。
1- 用于unique_ptr
分配,std::move::
应该使用。
2-make_unique
无法访问私有构造函数,应显式调用构造函数:
theDB = unique_ptr<ClientDB>(new ClientDB());
3-unique-ptr
必须在类外初始化:
unique_ptr<ClientDB> ClientDB::theDB;
4- 同一对象的 main 中不能使用三个唯一指针,唯一性只允许使用一个。unique_ptr
应改为使用
对的引用:unique_ptr<ClientDB>& db1=ClientDB::getInstance();
最后代码应该是这样的
#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 = move(make_unique<ClientDB>());
theDB = unique_ptr<ClientDB>(new 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"});
}
};
unique_ptr<ClientDB> ClientDB::theDB;
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);
}
推荐阅读
- node.js - Amazon Lex 和 Amazon Lambda 帮助冰淇淋店
- excel - 循环遍历 Dv(当 h > a 时更改单元格)
- javascript - 输入正确的会话名称和密码后,响应为“空”
- amazon-web-services - AWS SAM - 如何在 swagger 端点 uri 上将阶段变量与 Fn::Sub 组合
- java - 仅删除链表中的一项而不是所有项
- kubernetes - Spark 流式传输,kafka 代理错误,“无法获取 spark-executor 的记录 - .... 在轮询 512 后”
- dygraphs - dygraph - 在 CSV 中解析日期时出错
- c - 从C中的字符串中删除字符串
- javascript - 删除焦点选择字段上的选择占位符
- javascript - Requirejs lib不是一个函数