【问题标题】:Nested class constructed in a member function with smart pointers in c++在 C++ 中使用智能指针在成员函数中构造的嵌套类
【发布时间】:2020-07-29 07:56:38
【问题描述】:

我有以下简单的代码

class Hybrid{
   std::unique_ptr<Bcf> bndfac; 


   void constructbndFace( const int &nn){ 
      bndfac( new Bcf(nn) ); // Does not work (A)
      //std::unique_ptr<Bcf> bndfac( new Bcf(nn) ); // WORKS (B)
   }
 }

class Bcf{
   Bcf(const int nn_) : nn(nn_){}
 private:
    int nn;
 }

当我尝试调用Hybrid::constructbndFace 时,我不明白为什么编译器会抱怨std::unique_ptr&lt; Bcf &gt;' does not provide a call operator。如果我使用注释行 (B),编译器将不再抱怨。

我的问题是,如果我使用 (B) 行,实例化的对象会通过我在 Hybrid 类中的声明来访问,还是我做错了什么Hybrid-&gt;bndFace

【问题讨论】:

  • bndfac( new Bcf(nn) ); -> bndfac = std::make_unique&lt;Bcf&gt;(nn);
  • bndfac(...) 在{ } 内部应该是什么意思?您的意思是把它放到initializer list 中吗?
  • 不,我不是故意的,因为在我初始化 Hybrid 时,我不知道整数 nn。因此,我在 Hybrid 中创建了一个成员函数来构造 Bcf。实际上 Hybrid 有更多的东西,但我已经将其浓缩为实际问题

标签: c++ class smart-pointers


【解决方案1】:

在您的 B 行中,您创建了一个临时对象,其名称与成员名称相同。然后在下一行用右弯括号销毁。

如果你想构造 bndfac 对象,你应该用这个替换你的 B 行:

bndfac = std::make_unique<Bcf>(nn);

【讨论】:

  • 什么在 B 行被立即销毁? bndfac 不是临时的,它是一个左值。
  • @ATK,为什么它应该起作用?您不能通过B(A) 语法将A 分配(或“重新构造”)B。
  • 但我只是声明了一个指向混合类中的类的指针。我不是在建造它。
  • 我的整个想法是我想声明名称,例如保留它,类似于以 C 方式声明 extern,然后在相关时创建它
  • @ATK,不,所有子对象都是在对象构造期间始终构造的。智能指针的默认构造函数只是用空指针初始化它。您可以稍后使用std::make_unique&lt;Bcf&gt;(...) 或std::unique_ptr&lt;Bcf&gt;(new Bcf(...)) 重新分配它(使用=)。 Bcf 需要 new(并且 std::make_unique 内部有 new),而不是智能指针对象本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多