es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , ,

Answer

  1. Avatar for 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 de Vector2f a otro objeto Vector2f.

    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 tipo float para las coordenadas x y y. 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 objeto Vector2f y luego copie los valores x y y de ese objeto en el nuevo objeto que se está creando.

    La definición corregida de la clase se vería así:

    namespace pmp
    {
        struct Vector2f
        {
            /* Elementos */
            float x;
            float y;
    
            /* Métodos */
    
            // Constructores y Destructor
            Vector2f();
            Vector2f(float i, float j);
            Vector2f(const Vector2f& og); // Constructor de copia
            virtual ~Vector2f();
    
            // Operadores unarios
            float magnitude();
            Vector2f normal();
        };
    };
    

    Y la definición del constructor se vería así:

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

    Después de realizar este cambio, el error debería resolverse y la clase Vector2f se puede utilizar para crear y devolver nuevos objetos.

Comments are closed.