错误:没有构造函数的实例与参数列表匹配

4 c++ constructor reference

作为作业的一部分,我们被要求创建一个 Vector3D 类,该类使用在堆上分配的内存。我有一个带有以下构造函数的 Vector3DHeap 类。

Vector3DHeap::Vector3DHeap(float& x, float& y, float& z)
{
    this->x = &x;
    this->y = &y;
    this->z = &z;
}
Run Code Online (Sandbox Code Playgroud)

如果我想获得单位向量,我希望能够执行以下操作。这给出了错误消息“没有构造函数的实例与参数列表匹配,参数类型是(浮点数,浮点数,浮点数)。

Vector3DHeap* Vector3DHeap::getUnitVector()
{
    float m = *getMagnitude();

    return new Vector3DHeap((*x / m), (*y / m), (*z / m));
}
Run Code Online (Sandbox Code Playgroud)

如果我定义三个浮点变量 a、b 和 c 并将它们传递给构造函数,编译器会很高兴。上面的代码有什么问题?

Vector3DHeap* Vector3DHeap::getUnitVector()
{
    float m = *getMagnitude();

    float a, b, c;

    a = *x / m;
    b = *y / m;
    c = *z / m;

    return new Vector3DHeap(a, b, c);
}
Run Code Online (Sandbox Code Playgroud)

非常感谢,乔治

Dan*_*rey 9

您对第一个版本的问题是您的编译器正试图防止出现错误。

您对第二个版本的问题是您比编译器更聪明并成功地创建了一个错误。

给定您的构造函数,您希望存储指向float通过引用传递的值的指针。由于您的第二个版本现在使用对局部变量的引用来调用构造函数float a, b, c;,因此您创建了一个Vector3DHeap引用它们的实例。但是一旦getUnitVector返回,这些变量就不再存在,存储在其中的引用Vector3DHeap就变成了悬空引用。

解决方案不是在内部存储指针Vector3DHeap或创建参数的副本:

Vector3DHeap::Vector3DHeap(float x, float y, float z)
{
    this->x = new float(x);
    this->y = new float(y);
    this->z = new float(z);
}
Run Code Online (Sandbox Code Playgroud)

不过,请确保您正确删除了存储的浮点数。