首页 > 解决方案 > 唯一指针中的赋值运算符错误

问题描述

我试图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 ‘&lt;unresolved overloaded function type>’)
     theDB = make_unique<ClientDB>;

另一个问题是是否nullptr可以用于unique_ptr.

标签: c++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);
}

推荐阅读