elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema operador asignación y operador asignación [struct] c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema operador asignación y operador asignación [struct] c++  (Leído 3,045 veces)
luiggy2


Desconectado Desconectado

Mensajes: 439


¡ Hello word ! XD


Ver Perfil
Problema operador asignación y operador asignación [struct] c++
« en: 15 Octubre 2013, 01:38 am »

Buenas noches!

Estaba haciendo un struct que encapsulara un vector que
representa unas coordenadas en el espacio. Todo va bien hasta
que llego al operador de asignación y al operador + que no
funciona del todo bien.

El código es el siguiente y el error de compilación está debajo:

Código
  1. #ifndef _PUNTO_H_
  2. #define _PUNTO_H_
  3.  
  4. #include <vector>
  5. using namespace std;
  6.  
  7. struct Punto{
  8.  Punto(int tam){
  9.    this->_coord=vector<double>(tam,0);
  10.  }
  11.  
  12.  Punto(vector<double> v){
  13.    this->_coord=v;
  14.  }
  15.  
  16.  Punto(const Punto& p){
  17.    this->_coord=p._coord;
  18.  }
  19.  
  20.  //operadores
  21.  
  22.  Punto& operator= (const Punto& p){
  23.    Punto pp(p._coord.size()); //ERROR
  24.    pp._coord=p._coord;
  25.    return pp;
  26.  }
  27.  
  28.    Punto& operator+ (const Punto& p){
  29.      vector<double> pp = this->_coord;
  30.      for(int i=0; i<this->_coord.size(); i++){
  31. pp[i]+=p._coord[i];
  32.      }
  33.  
  34.      return Punto(pp); //ERROR
  35.    }
  36.  
  37.  
  38.  vector<double> _coord;
  39. };
  40. #endif //_PUNTO_H_
  41.  

El error que da en compilación es el siguiente:
Código:
punto.h: En la función miembro ‘Punto& Punto::operator=(const Punto&)’:
punto.h:29:11: aviso: se devolvió una referencia a la variable local ‘pp’ [activado por defecto]
punto.h: En la función miembro ‘Punto& Punto::operator+(const Punto&)’:
punto.h:40:22: error: inicialización inválida de una referencia que no es constante de tipo ‘Punto&’ desde un r-valor de tipo ‘Punto’

Donde las lineas corresponden a:
Código:
Linea 29:     Punto pp(p._coord.size());
Línea 40:      return Punto(pp);

Espero sus respuestas.
Muchas gracias!
Luiggy2


En línea

" Las grandes ideas suelen salir la mayoría de veces de grandes estupideces "
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema operador asignación y operador asignación [struct] c++
« Respuesta #1 en: 15 Octubre 2013, 08:38 am »

Código
  1. Punto& operator= (const Punto& p);
  2.  
  3. Punto& operator+ (const Punto& p);

Fíjate que en las dos declaraciones, el valor de retorno es una referencia.

No puedes devolver como referencia una variable o clase cuyo ámbito sea la función que define el operador. Me explico:

Código
  1. int& GetValor( )
  2. {
  3.  int i;
  4.  i=5;
  5.  return i;
  6. }
  7.  
  8. void main( )
  9. {
  10.  int valor = GetValor( );
  11. }

Aquí se reproduce el mismo problema. El ámbito de "i" es GetValor... fuera de dicha función, "i" no tiene ni sentido ni valor. Si devuelves una referencia a "i"... y después "i" se libera, cualquier lectura y/o escritura sobre la referencia será, cuanto menos, insegura. Lo mejor que te puede pasar en estos casos es que o bien te falle al compilar o bien se caiga la aplicación.

Además, el operador= tiene un problema. Si tu sobrecargas el operador de asignación se presupone que quieres modificar la instancia actual de la clase... y tu ahí estás haciendo una copia de p para devolverla y sin modificar "this"... eso no tiene sentido.

el operador de asignación debería tener más bien esta forma:

Código
  1. Punto& operator= (const Punto& p)
  2. {
  3.    _coord = p._coord;
  4.    return *this;
  5. }

Ahora fíjate que en el return, en vez de devolver una referencia a una clase propia de la función, estoy devolviendo una referencia a la instancia de la clase "modificada", que sí existirá después del return.

En cuanto al operador suma, lo mejor es que no devuelvas una referencia.

Un saludo.


En línea

luiggy2


Desconectado Desconectado

Mensajes: 439


¡ Hello word ! XD


Ver Perfil
Re: Problema operador asignación y operador asignación [struct] c++
« Respuesta #2 en: 16 Octubre 2013, 23:35 pm »

Perfecto, no se como no me di cuenta!
Esto de programar con sueño no es muy bueno.

Muchas gracias!
Luiggy2
En línea

" Las grandes ideas suelen salir la mayoría de veces de grandes estupideces "
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con operador max(int,int); [Solucionado]
Java
Debci 2 3,064 Último mensaje 22 Mayo 2009, 15:37 pm
por Debci
problema con el operador condicional ? en C
Programación C/C++
higor24 3 3,801 Último mensaje 15 Noviembre 2010, 21:17 pm
por higor24
Problema con la sobrecarga del operador <<
Programación C/C++
Lord_Lobotomi 2 2,405 Último mensaje 5 Diciembre 2011, 19:36 pm
por Lord_Lobotomi
Problema de asignacion (diferentes tipos)
Programación C/C++
soyloqbuskas 4 3,526 Último mensaje 28 Septiembre 2012, 16:21 pm
por anonimo12121
Problema con asignación de memoria en puntero de caracteres.
Programación C/C++
1t4h1s4 9 5,248 Último mensaje 13 Febrero 2013, 02:58 am
por 1t4h1s4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines