【问题标题】:C++ no match for 'operator=' in '*foo [duplicate]C ++与'* foo中的'operator ='不匹配[重复]
【发布时间】:2014-11-17 04:39:03
【问题描述】:
Shape *foo = new Shape[2];
foo[0] = new Triangle();

类形状。 Triangle 类继承 Shape,默认构造函数。我使用上面的方法来制作 foo Triangle 的第一个元素并给我: no match for 'operator=' in '*foo = (((Triangle*)operator new(20u)), (<anonymous>->Triangle::Triangle(), <anonymous>))' candidates are: Shape& Shape::operator=(const Shape&)

【问题讨论】:

  • 您想要Shape 的数组还是Shape* 的数组?
  • 一个数组形状,我可以在其中投射第一个元素三角形和第二个矩形...

标签: c++


【解决方案1】:

foo[0] 的类型是 Shape。您不能将Triangle* 分配给foo[0]。你需要的是:

Shape** foo = new Shape*[2];
foo[0] = new Triangle();

确保在调用之前删除foo 的内容

delete [] foo;

更好的选择

使用std::vector 中的std::unique_ptrs。

std::vector<std::unique_ptr<Shape>> foo;
foo.push_back(std::unique_ptr<Shape>(new Triangle()));

然后,您不必担心显式释放内存。 std::vector 会小心删除 std::unique_ptrs。当std::unique_ptrs被删除时,它们将删除它们指向的对象。

【讨论】:

  • 请不要教人们使​​用内置数组和原始指针以及delete
  • 我更喜欢std::vector&lt;std::unique_ptr&lt;Shape&gt;&gt;,因为它会自动管理数组和对象分配的生命周期。
  • @n.m.感谢您的推动。
  • @cdhowie,我正在更新答案,以便在您撰写评论时完全使用该答案。
猜你喜欢
  • 2019-04-09
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2014-07-03
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多