在返回结构时在 C++ 中获取“没有有效的复制构造函数”

Getting "No valid copy constructor" in C++ on return struct

提问人:J J 提问时间:12/20/2021 最后编辑:Remy LebeauJ J 更新时间:1/28/2022 访问量:200

问:

我目前正在使用 Visual Studio Community Edition 2019 在 C++ 中实现一个简单的 2D 向量类。Vector2f

当我尝试在方法中返回新构造的时,例如:

return Vector2f((this->x/sum),(this->y/sum);

我得到一个提示:

没有适合 Vector2f 的复制构造函数

以及编译时错误:

“return”: 无法从“Vector2f”转换为“Vector2f”

我已经从头开始重写了几次类,但似乎仍然出现错误。我不明白,到底出了什么问题?

Vector2f_struct.h

#pragma once

#ifndef PMP_VECTOR2F_STRUCT__H
#define PMP_VECTOR2F_STRUCT__H

namespace pmp
{
    struct Vector2f
    {
        /* Elements */
        float x;
        float y;

        /* Methods */

        // Constructors & Destructor
        Vector2f();
        Vector2f(float i, float j);
        Vector2f(Vector2f& og);
        virtual ~Vector2f();

        // Unary Operators
        float magnitude();
        Vector2f normal();
    };
};

#endif

Vector2f_struct.cpp

#include "pmp_Vector2f_struct.h"

#ifndef PMP_VECTOR2F_STRUCT__CPP
#define PMP_VECTOR2F_STRUCT__CPP

/* Dependencies */
#include <math.h>

namespace pmp
{
    Vector2f::Vector2f()
    {
        this->x = 0.0f;
        this->y = 0.0f;
        return;
    };

    Vector2f::Vector2f(float i, float j)
    {
        this->x = i;
        this->y = j;
        return;
    };

    Vector2f::Vector2f( Vector2f& og )
    {
        this->x = og.x;
        this->y = og.y;
        return;
    };

    Vector2f::~Vector2f()
    {
        this->x = 0.0f;
        this->y = 0.0f;
        return;
    };

    float Vector2f::magnitude()
    {
        float c2 = (this->x * this->x) + (this->y * this->y);
        return sqrt(c2);
    };

    Vector2f Vector2f::normal()
    {
        float sum = this->x + this->y;
        return Vector2f(this->x / sum, this->y / sum); // Error here.
    };

};

#endif
C++ 结构 常量 copy-constructor

评论

4赞 273K 12/20/2021
你返回一个临时对象,r-value不能绑定到Vector2f&,但可以绑定到const Vector2f&。复制构造函数
4赞 David Grayson 12/20/2021
是的,您没有有效的复制构造函数,因为您忘记了参数的限定符。在线查找复制构造函数的示例。const
3赞 David Grayson 12/20/2021
此外,没有理由自己定义复制构造函数,因为编译器提供的默认构造函数应该执行与您的相同操作。也不需要析构函数。
2赞 HolyBlackCat 12/20/2021
摆脱,你不需要它。最有可能的是,你也不需要析构函数,除非你真的需要它是虚拟的。在这种情况下,我会将其定义为 .将内部数字归零没有多大意义,可能会被优化掉。Vector2f(Vector2f& og);virtual ~Vector2f() {}
0赞 J J 12/20/2021
啊,谢谢大家!我都忘了!

答:

4赞 Vlad from Moscow 12/20/2021 #1

复制构造函数的参数具有非常量引用类型

Vector2f(Vector2f& og);

在成员函数 normal 中,返回一个被复制的临时对象。不能将临时对象与非常量左值引用绑定。

重新声明复制构造函数,例如

Vector2f(const Vector2f& og);

或者只是删除其显式声明。在这种情况下,编译器会为您生成它。

请注意,构造函数和析构函数中的 return 语句是多余的。