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

C++ 错误:没有与参数列表匹配的构造函数实例,c++,reference,constructor,C++,Reference,Constructor,作为任务的一部分,我们被要求创建一个Vector3D类,该类使用堆上分配的内存。我有一个具有以下构造函数的Vector3DHeap类 Vector3DHeap::Vector3DHeap(float& x, float& y, float& z) { this->x = &x; this->y = &y; this->z = &z; } 如果我想得到一个单位向量,我希望它能做到以下几点。这会给出错误消息“

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

Vector3DHeap::Vector3DHeap(float& x, float& y, float& z)
{
    this->x = &x;
    this->y = &y;
    this->z = &z;
}
如果我想得到一个单位向量,我希望它能做到以下几点。这会给出错误消息“没有构造函数实例与参数列表匹配,参数类型为(float、float、float)

如果我定义三个浮点变量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);
}
非常感谢,,
George

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

第二个版本的问题是,你比你的编译器聪明,并且成功地创建了一个bug

给定构造函数,您希望存储指向通过引用传递的
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);
}

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

编译器最好阻止您将引用绑定到临时对象,否则您将得到一个指向已销毁对象的对象:表达式
*x/m
和类似的表达式都会生成一个临时
浮点
对象h将在表达式末尾消失。尝试将临时绑定到非
常量
引用将失败

但是,我怀疑您是否真的想这样做:除非您真的知道需要使用指针,否则不应该使用指针!您的构造函数可能应该如下所示:

Vector3DHeap::Vector3DHeap(float x, float y, float z)
    : x(x), y(y), z(z) {
}
当然,如果成员也是类型
float
getmagnity()
也应该返回
float
getUnitVector()
也应该返回
Vector3DHeap
而不是指向它的指针!

  • (*x/m)
    是一个临时对象
  • Vector3DHeap(float&x、float&y、float&z)
    需要一个非常量引用作为第一个参数

您不能将临时对象传递给一个期望非const引用的函数。请参阅C++为什么不希望允许这个。

您不能将临时绑定到非const引用。您的构造函数应该有<代码> const浮点和参数。@ N.M。他说他正在堆上存储数据,所以X、Y、Z实际上是指针。我不K。现在,您为什么要这样做,但肯定有一些实现是有用的。他不能使用常量引用,因为这样他就无法将它们分配给(非常量)指针。@DanielSaska
Vector
使用堆上分配的内存与其他人在堆上分配内存的Vector指针不同。OP需要做的是让Vector分配一些内存,然后使用该内存存储一些值。感谢您的回复。我们被要求“重写类”(称之为Vector3DHeap)以便将变量存储在堆上而不是堆栈上。“如果返回浮点和Vector3DHeap而不是指针,那么它们不会在堆栈上而不是堆上吗?@GeorgeRobinson对象在使用
new
new[]时存储在堆上
初始化它们。如果要返回新的Vector3DHeap(x,y,z),我必须返回指针类型,因为new返回指针?我很困惑,因为您说“getUnitVector()返回Vector3DHeap而不是指向它的指针!”!“@GeorgeRobinson:强制在堆上存储单个
float
s是非常愚蠢的,我当然希望你的老师不是这个意思!即使对象需要在堆上,你也会通过合适的类来分配(并实现)它们:返回未维护的对象的指针,否则通常是无效的。
Vector3DHeap::Vector3DHeap(float x, float y, float z)
    : x(x), y(y), z(z) {
}