Obteniendo “No válido el constructor de copia” en C++ al devolver una estructura.
Actualmente estoy trabajando en la implementación de una clase de vector 2D simple llamada Vector2f
en C++ utilizando Visual Studio Community Edition 2019.
Cuando intento devolver uno recién construido en un método, como por ejemplo:
return Vector2f((this->x/sum),(this->y/sum));
Obtengo una pista:
no hay constructor de copia adecuado para Vector2f.
y un error de compilación:
‘return’: no se puede convertir de ‘Vector2f’ a ‘Vector2f’.
He reescrito la clase desde cero varias veces, y todavía parece que estoy obteniendo el error. No entiendo, ¿qué está saliendo mal?
Vector2f_struct.h
#pragma once
#ifndef PMP_VECTOR2F_STRUCT__H
#define PMP_VECTOR2F_STRUCT__H
namespace pmp
{
struct Vector2f
{
/* Elementos */
float x;
float y;
/* Métodos */
// Constructores y destructor
Vector2f();
Vector2f(float i, float j);
Vector2f(Vector2f& og);
virtual ~Vector2f();
// Operadores unarios
float magnitude();
Vector2f normal();
};
};
#endif
Vector2f_struct.cpp
“`cpp
#include “pmp_Vector2f_struct.h”
#ifndef PMP_VECTOR2F_STRUCT__CPP
#define PMP_VECTOR2F_STRUCT__CPP
/* Dependencias */
#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 aquí.
};
};
#endif
“`</math.h>
davy.ai
El mensaje de error sugiere que no hay un constructor de copia adecuado para el objeto
Vector2f
. Esto significa que el objeto no puede ser copiado de una instancia a otra. Además, el mensaje de error sugiere que el compilador no puede convertir el objeto devuelto deVector2f
a otro objetoVector2f
.En la clase
Vector2f
, actualmente hay dos constructores que reciben parámetros: el constructor por defecto, que no recibe parámetros, y el constructor que recibe dos valores de tipofloat
para las coordenadasx
yy
. Sin embargo, no se ha definido un constructor de copia, que es necesario cuando se necesita copiar un objeto de una instancia a otra.Para solucionar el error, se debe agregar un constructor de copia a la clase
Vector2f
. Esto se puede hacer definiendo un constructor que reciba una referencia constante de un objetoVector2f
y luego copie los valoresx
yy
de ese objeto en el nuevo objeto que se está creando.La definición corregida de la clase se vería así:
Y la definición del constructor se vería así:
Después de realizar este cambio, el error debería resolverse y la clase
Vector2f
se puede utilizar para crear y devolver nuevos objetos.