在 Copy 构造函数中分配整个 object?

Assign the whole object in the Copy constructor?

我想定义一个 copy-constructor,它只是将 object 分配给另一个:

Header:

 #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() {
}

class 本身不包含任何指针,但最终包含 object。这真的可以吗?

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

这给出了错误:

Testclass.cpp: In copy constructor ‘Testclass::Testclass(const Testclass&)’: Testclass.cpp:13:46: error: no matching function for call to ‘boost::math::geometric_distribution::geometric_distribution()’ Testclass::Testclass(const Testclass& obj_ref) {

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

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

的复制构造函数来修复它
Testclass::Testclass(const Testclass& obj_ref)
    : alpha(obj_ref.alpha), 
      geometricboost(obj_ref.geometricboost)
{
}

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

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

你最好从复制中实现赋值(使用复制然后交换习惯用法)而不是相反,如建议的那样 Calling assignment operator in copy constructor.

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