1. ホーム
  2. c++

[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない

2022-01-29 20:39:52

質問

課題の一部として、ヒープ上に割り当てられたメモリを使用するVector3Dクラスを作成するように求められました。私は、以下のコンストラクタを持つVector3DHeapクラスを持っています。

Vector3DHeap::Vector3DHeap(float& x, float& y, float& z)
{
    this->x = &x;
    this->y = &y;
    this->z = &z;
}

単位ベクトルを取得する場合、以下のようにできると思っていたのですが。これは、エラーメッセージ "引数リストに一致するコンストラクタのインスタンスはありません、引数タイプは (float, float, float) です。

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

    return new Vector3DHeap((*x / m), (*y / m), (*z / m));
}

a、b、cの3つのfloat変数を定義して、これらをコンストラクタに渡すと、コンパイラは満足します。上のコードのどこが問題なのでしょうか?

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);
}

ありがとうございました。 ジョージ

解決方法は?

最初のバージョンでのあなたの問題は、コンパイラがバグを防ごうとしていることです。

あなたの問題点は セカンド のバージョンは、あなたがコンパイラーを出し抜き、バグを作り出すことに成功したということです。

コンストラクタで float の値が参照渡しされます。2 番目のバージョンでは、ローカル変数への参照でコンストラクタを呼び出すようにしたので 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);
}

ただし、保存されているフロートをきちんと削除してください。