【问题标题】:Assign the whole object in the Copy constructor?在 Copy 构造函数中分配整个对象?
【发布时间】:2015-08-26 14:02:54
【问题描述】:

我想定义一个复制构造函数,它只是将对象分配给另一个对象:

标题:

 #ifndef TESTCLASS_HPP
#define TESTCLASS_HPP

#include <boost/math/distributions/geometric.hpp>

class Testclass {
public:
    Testclass();

    virtual ~Testclass();
private:
    Testclass(const Testclass& orig);
    int alpha;
    boost::math::geometric_distribution <> geometricboost;

};

#endif  /* TESTCLASS_HPP */

实施:

   #include "Testclass.hpp"

Testclass::Testclass() : geometricboost(0) {
}

Testclass::Testclass(const Testclass& obj_ref) {
     *this = obj_ref;
}

Testclass::~Testclass() {
}

类本身不包含任何指针,但最终是一个对象。这真的可以吗?

如果没有,最简单的分配方法是什么?

这给出了错误:

Testclass.cpp:在复制构造函数中'Testclass::Testclass(const Testclass&)': Testclass.cpp:13:46: error: no matching function for 拨电至 'boost::math::geometric_distribution::geometric_distribution()' Testclass::Testclass(const Testclass& obj_ref) {

【问题讨论】:

  • 如果您的类不包含任何指针或其他默认复制语义不起作用的对象,那么您根本不需要编写复制分配
  • 这将调用复制赋值运算符(默认的或覆盖的版本)。因此,从构造函数调用方法的常见警告适用。特别是:不要期望任何virtual 能够正常工作。
  • 这不是关于什么是必要的。我很感兴趣这是否以及如何工作
  • @Qohelet 请发布一个minimal reproducible example 会产生该错误。

标签: c++ this copy-constructor


【解决方案1】:

如果您实现自己的复制构造函数,那么您应该初始化构造函数的初始化列表中的所有成员。否则,在执行赋值运算符之前,将为非内置类型的每个成员调用默认构造函数。

boost::math::geometric_distribution 似乎没有默认构造函数。这就是你得到编译器错误的原因。您可以使用 geometric_distribution 的复制构造函数来修复它:

Testclass::Testclass(const Testclass& obj_ref)
    : alpha(obj_ref.alpha), 
      geometricboost(obj_ref.geometricboost)
{
}

根据rule of three,您还应该考虑实现复制赋值运算符(移动构造函数、移动赋值运算符)。

【讨论】:

  • 好的,知道了。添加初始化后,错误消失了......但有一件事让我感到困惑。我有几个类——在其中一些类中发生了如上所述的错误——在一些类中没有。即使它们具有相同的成员和功能?错误是否也取决于类的使用情况
【解决方案2】:

当您的复制构造函数运行时,它首先尝试默认初始化geometricboost(因为您没有为其指定任何初始化),然后才调用赋值运算符。这不起作用,因为几何分布没有默认构造函数。

您最好从副本执行分配(使用复制然后交换习语)而不是反之亦然,如建议的那样 Calling assignment operator in copy constructor.

或者,您可以完全删除您的复制构造函数 - 编译器生成的构造函数可以正常工作。

【讨论】:

  • 实际上 - 只有在需要特殊初始化时才会出现错误?
  • 是的。如果所有成员都可以默认构造,那么您的代码不会出现错误。但这并不意味着这是一个好主意。
猜你喜欢
  • 2018-10-07
  • 2020-03-04
  • 2013-01-06
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多