我正在学习一些C ++,来自Java ......
我写了几个类,Vector
(一个带有分量x,y,z的三维矢量)和Bezier
(一个基于4个输入向量的三次贝塞尔曲线)。
Vector
无法定义默认构造函数。
Bezier
给了我一个编译错误:
Bezier.h
class Bezier
{
public:
Vector p1;
Vector cp1;
Vector cp2;
Vector p2;
Bezier(const Vector &p1, const Vector &cp1, const Vector &cp2, const Vector &p2);
};
Bezier.cpp
Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_)
{
p1 = p1_;
cp1 = cp1_;
cp2 = cp2_;
p2 = p2_;
}
错误:
在构造函数'Bezier :: Bezier(const Vector&,const Vector&,const Vector&,const Vector&)'中: 错误:没有用于调用'Vector :: Vector()'
的匹配函数
似乎编译器希望我创建一个默认构造函数Vector()
,尽管我不需要它。我错过了一些明显的东西吗?
答案 0 :(得分:8)
当您输入构造函数时,尚未初始化成员变量。因此,您的代码会尝试调用p1
,cp1
等的默认构造函数,以便在根据p1 = p1_; ...
覆盖该定义之前对其进行初始化。要告诉您的代码根本不调用默认构造函数,请使用Bezier::Bezier(...) : p1(p1_), cp1(cp1_), ... {}
。这绕过了对默认构造函数的需求,而是立即通过复制构造函数初始化Vector
的所有实例。
答案 1 :(得分:5)
您的代码(现在是)需要默认的Vector构造函数。
再次查看此代码:
Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_)
{
p1 = p1_;
cp1 = cp1_;
cp2 = cp2_;
p2 = p2_;
}
它的作用是默认构造所有4个向量,然后为它们赋值。
如果你想摆脱默认构造步骤并使用带参数的构造函数构造这些向量,你可以这样写:
Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_)
: p1(p1_), cp1(cp1_), cp2(cp2_), p2(p2_)
{}