唯一指针中的赋值运算符错误

时间:2019-01-27 07:15:05

标签: c++ unique-ptr

我试图在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

1 个答案:

答案 0 :(得分:0)

最后,在老师的帮助下,我可以解决问题。有几点要考虑。

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);
}