从私有成员变量的成员方法返回unique_ptr

时间:2018-10-18 13:39:21

标签: c++ c++11

我有以下代码,试图从成员函数返回私有成员变量的unique_ptr:

#include <memory>

class Interface1
{
public:
  virtual ~Interface1() = default;
  virtual void Show() const = 0;
};

class Interface2
{
public:
  virtual ~Interface2() = default;
  virtual std::unique_ptr<Interface1> Interface1Ptr() const = 0;
};

class CInterface1 : public Interface1
{
public:
  CInterface1 (){}
  virtual ~CInterface1() = default;
  virtual void Show() const override
  {
  }
};

class CInterface2 : public Interface2
{   
public:
  CInterface2 ()
  {
    mifi = std::make_unique<CInterface1>();
  }
  virtual ~CInterface2() = default;
  virtual std::unique_ptr<Interface1> Interface1Ptr() const override
  {
    return std::move(mifi);
  }
  private:
   std::unique_ptr<Interface1> mifi;
};

main()
{
    return 0;
}

但是我遇到了编译错误:

$ c++ -std=c++14 try50.cpp
try50.cpp: In member function 'virtual std::unique_ptr<Interface1> CInterface2::Interface1Ptr() const':
try50.cpp:38:22: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Interface1; _Dp = std::default_delete<Interface1>]'
 return std::move(mifi);
                      ^
In file included from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/memory:81:0,
                 from try50.cpp:1:
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/unique_ptr.h:356:7: note: declared here
       unique_ptr(const unique_ptr&) = delete;
       ^

是否不可能返回unique_ptr-如果我也失去所有权也可以吗?

1 个答案:

答案 0 :(得分:9)

您已声明成员函数const:

virtual std::unique_ptr<Interface1> Interface1Ptr() const
                                                    ^

因此成员是const。您尝试从const成员复制初始化返回的唯一指针。由于成员是const,因此无法将其从中移出(因为move构造函数的参数为​​非const),因此只能进行复制。但是如错误所示,唯一指针不可复制。

  

是否不可能返回unique_ptr-如果我也放弃所有权,那还好吗?

可以从成员唯一指针转移所有权...但是只能在非const成员函数中使用。

相关问题