im是c ++的新手,我试图调用make以2个类作为其参数的类构造函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了im是c ++的新手,我试图调用make以2个类作为其参数的类构造函数相关的知识,希望对你有一定的参考价值。
#include <iostream>
using namespace std;
double Default = 0;
class Vector
{
public:
Vector(double x, double y, double z);
double X, Y, Z;
double fVctr[3];
};
Vector::Vector(double x,double y,double z)
{
this->X = x;
this->Y = y;
this->Z = z;
this->fVctr[0] = X;
this->fVctr[1] = Y;
this->fVctr[2] = Z;
}
这部分抛出错误,没有默认构造函数。
class Edge
{
public:
Vector vectA;
Vector vectB;
Edge(Vector _vectA , Vector _vectB){
this->vectA = _vectA;
this->vectB = _vectB;
}
};
int main()
{
Vector Vertex(0,2,5);
// Debug
cout << Vertex.X <<"
"<< endl;
cout << Vertex.Y << "
" << endl;
cout << Vertex.Z << "
" << endl;
}
答案
给出一个构造函数
Constructor( ... )
{ // A
...
};
在A点,当我们开始使用构造函数的代码时,所有成员都将被默认初始化,因为它们不能被初始化。要初始化没有默认构造函数或const
成员的成员,必须使用所谓的member initializer list。
在您的示例中,它看起来像这样:
Edge(Vector _vectA, Vector _vectB) : vectA(_vectA), vectB(_vectB)
{ // This can be empty, since everything is done, but it has to exist nonetheless.
}
最好使用成员初始化程序列表,因为您可以保存一些默认的初始化,并且每个成员都处于应进行任何操作之前的状态,这是一个好习惯。
PS:您不必按this->member
来引用成员,只需编写member
。另外,请勿使用using namespace std;
。
另一答案
原因在您的Edge类构造方法中。
Edge(Vector _vectA , Vector _vectB){
this->vectA = _vectA;
this->vectB = _vectB;
}
参数需要一个默认值。为此,您可以在Vector类中重载构造函数。
像这样:
Vector::Vector(double x=0,double y=0,double z=0)
{
this->X = x;
this->Y = y;
this->Z = z;
this->fVctr[0] = X;
this->fVctr[1] = Y;
this->fVctr[2] = Z;
}
或类似这样:
Vector::Vector()
{
this->X = 0;
this->Y = 0;
this->Z = 0;
this->fVctr[0] = X;
this->fVctr[1] = Y;
this->fVctr[2] = Z;
}
当然,您没有在Main Procedure中使用Edge类。因此,您可以安全地删除或注释该类,并防止代码的编译错误。
以上是关于im是c ++的新手,我试图调用make以2个类作为其参数的类构造函数的主要内容,如果未能解决你的问题,请参考以下文章