提问人:J J 提问时间:12/20/2021 最后编辑:Remy LebeauJ J 更新时间:1/28/2022 访问量:200
在返回结构时在 C++ 中获取“没有有效的复制构造函数”
Getting "No valid copy constructor" in C++ on return struct
问:
我目前正在使用 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
答:
4赞
Vlad from Moscow
12/20/2021
#1
复制构造函数的参数具有非常量引用类型
Vector2f(Vector2f& og);
在成员函数 normal 中,返回一个被复制的临时对象。不能将临时对象与非常量左值引用绑定。
重新声明复制构造函数,例如
Vector2f(const Vector2f& og);
或者只是删除其显式声明。在这种情况下,编译器会为您生成它。
请注意,构造函数和析构函数中的 return 语句是多余的。
评论
const
Vector2f(Vector2f& og);
virtual ~Vector2f() {}