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个类作为其参数的类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Dart以交替方式组合两个列表

了解 C/C++ 中函数调用的堆栈框架? [关闭]

使用C ++标准库以对数时间进行Heapify

PHP多个对象函数调用

大侠,可以告诉我怎么用C语言以2进制读取png图片的宽和高吗?谢了!!!

扩展宏以进行调试?