在 C++ 中获取 "No valid copy constructor" return 结构
Getting "No valid copy constructor" in C++ on return struct
我目前正在使用 Visual Studio Community Edition 2019 在 C++ 中实现一个简单的二维向量 class Vector2f
。
当我尝试return一个新构造的方法时,例如:
return Vector2f((this->x/sum),(this->y/sum);
我得到一个提示:
no suitable copy constructor for Vector2f
和一个编译错误:
'return': cannot convert from 'Vector2f' to 'Vector2f'
我已经从头开始重写了 class 几次,但似乎仍然出现错误。不明白,到底是哪里出了问题?
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
复制构造函数的参数有非常量引用类型
Vector2f(Vector2f& og);
在成员函数 normal 中 returned 复制了一个临时对象。您不能将临时对象与非常量左值引用绑定。
像这样重新声明复制构造函数
Vector2f(const Vector2f& og);
或者只是删除它的显式声明。在这种情况下,编译器会为您生成它。
注意构造函数和析构函数中的return语句是多余的
我目前正在使用 Visual Studio Community Edition 2019 在 C++ 中实现一个简单的二维向量 class Vector2f
。
当我尝试return一个新构造的方法时,例如:
return Vector2f((this->x/sum),(this->y/sum);
我得到一个提示:
no suitable copy constructor for Vector2f
和一个编译错误:
'return': cannot convert from 'Vector2f' to 'Vector2f'
我已经从头开始重写了 class 几次,但似乎仍然出现错误。不明白,到底是哪里出了问题?
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
复制构造函数的参数有非常量引用类型
Vector2f(Vector2f& og);
在成员函数 normal 中 returned 复制了一个临时对象。您不能将临时对象与非常量左值引用绑定。
像这样重新声明复制构造函数
Vector2f(const Vector2f& og);
或者只是删除它的显式声明。在这种情况下,编译器会为您生成它。
注意构造函数和析构函数中的return语句是多余的