如何在构造函数中初始化std :: unique_ptr?

32 c++ smart-pointers ifstream unique-ptr

A.hpp:

class A {
  private:
   std::unique_ptr<std::ifstream> file;
  public:
   A(std::string filename);
};
Run Code Online (Sandbox Code Playgroud)

A.cpp:

A::A(std::string filename) {
  this->file(new std::ifstream(filename.c_str()));
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误被抛出:

A.cpp:7:43: error: no match for call to ‘(std::unique_ptr<std::basic_ifstream<char> >) (std::ifstream*)’
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么会这样?我已经尝试了很多不同的方法让它工作,但无济于事.

0x4*_*2D2 39

您需要通过member-initializer列表初始化它:

A::A(std::string filename) :
    file(new std::ifstream(filename));
{ }
Run Code Online (Sandbox Code Playgroud)

你的例子是试图召唤operator ()一个unique_ptr不可能的东西.

更新:BTW,C++ 14具有std::make_unique:

A::A(std::string filename) :
    file(std::make_unique<std::ifstream>(filename));
{ }
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您需要事先在构造函数中进行一些检查,则调用`file`上的`reset()`函数来分配`unique_ptr`. (4认同)

Jon*_*ter 5

你可以这样做:

A:A(std::string filename)
    : file(new std::ifstream(filename.c_str())
{
}
Run Code Online (Sandbox Code Playgroud)