在 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.
或者,您可以完全删除复制构造函数 - 编译器生成的复制构造函数可以正常工作。
我想定义一个 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.
或者,您可以完全删除复制构造函数 - 编译器生成的复制构造函数可以正常工作。