Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con operador new y paso de objetos como argumentos

Estas en el tema de Problema con operador new y paso de objetos como argumentos en el foro de C/C++ en Foros del Web. Bueno, tengo un problema y no entiendo cuál es, me podrían ayudar? Tengo los siguientes archivos: Personaje.h @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #ifndef PERSONAJE_H ...
  #1 (permalink)  
Antiguo 26/12/2012, 22:17
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Problema con operador new y paso de objetos como argumentos

Bueno, tengo un problema y no entiendo cuál es, me podrían ayudar?

Tengo los siguientes archivos:

Personaje.h
Código C++:
Ver original
  1. #ifndef PERSONAJE_H
  2. #define PERSONAJE_H
  3.  
  4. class Personaje
  5. {
  6. public:
  7.     Personaje(int = 0, int = 0, int = 0, int = 0);
  8.     int getHP();
  9.     int getATAQUE();
  10.     int getRESISTENCIA();
  11.     int getPODER();
  12.     void restarHP(int);
  13. private:
  14.     int hp;
  15.     int ataque_fisico;
  16.     int resistencia_fisica;
  17.     int poder_ataque;
  18. };
  19.  
  20. #endif

Personaje.cpp
Código C++:
Ver original
  1. #include "Personaje.h"
  2.  
  3. Personaje::Personaje(int h, int a, int r, int p)
  4.     : hp(h),
  5.       ataque_fisico(a),
  6.       resistencia_fisica(r),
  7.       poder_ataque(p)
  8. {
  9.     // Constructor vacío.
  10. }
  11.  
  12. int Personaje::getHP()
  13. {
  14.     return hp;
  15. }
  16.  
  17. int Personaje::getATAQUE()
  18. {
  19.     return ataque_fisico;
  20. }
  21.  
  22. int Personaje::getRESISTENCIA()
  23. {
  24.     return resistencia_fisica;
  25. }
  26.  
  27. int Personaje::getPODER()
  28. {
  29.     return poder_ataque;
  30. }
  31.  
  32. void Personaje::restarHP(int x)
  33. {
  34.     hp = hp - x;
  35. }

Simulador.h
Código C++:
Ver original
  1. #ifndef SIMULADOR_H
  2. #define SIMULADOR_H
  3.  
  4. #include "Personaje.h"
  5.  
  6. class Simulador
  7. {
  8. public:
  9.     Simulador(Personaje, Personaje); // Constructor.
  10.     void pelear(); // Función para empezar una pelea.
  11. private:
  12.     Personaje jugador;
  13.     Personaje enemigo;
  14. };
  15.  
  16. #endif

Simulador.cpp
Código C++:
Ver original
  1. #include <iostream>
  2. using std::cout;
  3. using std::cin;
  4. using std::endl;
  5.  
  6. #include <cstdlib>
  7. using std::rand;
  8. using std::srand;
  9.  
  10. #include <ctime>
  11. using std::time;
  12.  
  13. #include "Simulador.h"
  14.  
  15. Simulador::Simulador(Personaje a, Personaje b)
  16.     : jugador(a),
  17.       enemigo(b)
  18. {
  19.     // Constructor vacío.
  20. }
  21.  
  22. void Simulador::pelear()
  23. {
  24.     srand(time(0));
  25.     int bla;
  26.     int dano;
  27.     enum estado{GANO, PERDIO, CONTINUA};
  28.     estado juego;
  29.     juego = CONTINUA;
  30.  
  31.     cout << "\nBola de moco gigante ha aparecido!\nQue comience la batalla!\n" << endl;
  32.  
  33.     cout << "HP del jugador: " << jugador.getHP() << endl;
  34.     cout << "\nHP del enemigo: " << enemigo.getHP() << endl;
  35.  
  36.     cout << "Escribe cualquier numero (no muy grande) y aprieta enter para atacar:";
  37.     cin >> bla;
  38.  
  39.     while(juego == CONTINUA)
  40.     {
  41.         cout << "HP del jugador: " << jugador.getHP() << endl;
  42.         cout << "HP del enemigo: " << enemigo.getHP() << endl;
  43.  
  44.         cout << "\nEscribe un numero y aprieta enter para atacar: ";
  45.         cin >> bla;
  46.  
  47.         dano = ((jugador.getATAQUE() / (rand() % 6 + 10)) * (jugador.getPODER() / (rand() % 6 + 10)) -
  48.                 (enemigo.getRESISTENCIA() / (rand() % 6 + 12)));
  49.         cout << "Jugador ha atacado!!!" << endl;
  50.         if(dano > enemigo.getHP())
  51.             dano = enemigo.getHP();
  52.         cout << "Enemigo ha perdido " << dano << " HP" << endl;
  53.         enemigo.restarHP(dano);
  54.  
  55.         if(enemigo.getHP() == 0)
  56.         {
  57.             juego = GANO;
  58.             continue;
  59.         }
  60.  
  61.  
  62.         dano = ((enemigo.getATAQUE() / (rand() % 6 + 10)) * (enemigo.getPODER() / (rand() % 6 + 10)) -
  63.                 (jugador.getRESISTENCIA() / (rand() % 6 + 12)));
  64.  
  65.         cout << "El enemigo ha atacado!!!" << endl;
  66.         if(dano > jugador.getHP())
  67.             dano = jugador.getHP();
  68.         cout << "Jugador ha perdido " << dano << " HP" << endl;
  69.         jugador.restarHP(dano);
  70.  
  71.         if(jugador.getHP() == 0)
  72.         {
  73.             juego = PERDIO;
  74.         }
  75.     }
  76.  
  77.     if(juego == GANO)
  78.     {
  79.         cout << "El jugador ha ganado. Si que mola, se sabe sonar los mocos." << endl;
  80.     }
  81.  
  82.     if(juego == PERDIO)
  83.     {
  84.         cout << "El jugador ha perdido. No rockanrolea ni se sabe sonar los mocos." << endl;
  85.     }
  86. }

Main.cpp
Código C++:
Ver original
  1. #include <iostream>
  2. using std::cout;
  3. using std::cin;
  4. using std::endl;
  5.  
  6. #include "Personaje.h"
  7. #include "Simulador.h"
  8.  
  9. int main()
  10. {
  11.     int opcion;
  12.  
  13.     Personaje jugador;
  14.     Personaje enemigo;
  15.     Simulador simulador(jugador, enemigo);
  16.  
  17.     int hp_jugador;
  18.     int ataque_jugador;
  19.     int resistencia_jugador;
  20.     int ppf_jugador;
  21.  
  22.     int hp_enemigo;
  23.     int ataque_enemigo;
  24.     int resistencia_enemigo;
  25.     int ppf_enemigo;
  26.  
  27.     cout << "Elija una opcion: " << endl;
  28.     cout << "1 - Jugar un juego." << endl;
  29.     cout << "2 - Salir." << endl << endl;
  30.  
  31.     cin >> opcion;
  32.  
  33.     while(opcion == 1)
  34.     {
  35.         cout << "Ingrese los siguientes datos: " << endl << endl;
  36.         cout << "HP del personaje: ";
  37.         cin >> hp_jugador;
  38.         cout << "Ataque del jugador: ";
  39.         cin >> ataque_jugador;
  40.         cout << "Resistencia del jugador: ";
  41.         cin >> resistencia_jugador;
  42.         cout << "Poder del ataque del jugador: ";
  43.         cin >> ppf_jugador;
  44.  
  45.         cout << "\nHP del enemigo: ";
  46.         cin >> hp_enemigo;
  47.         cout << "Ataque del enemigo: ";
  48.         cin >> ataque_enemigo;
  49.         cout << "Resistencia del enemigo: ";
  50.         cin >> resistencia_enemigo;
  51.         cout << "Poder de ataque del enemigo: ";
  52.         cin >> ppf_enemigo;
  53.  
  54.         jugador = new Personaje(hp_jugador, ataque_jugador, resistencia_jugador, ppf_jugador);
  55.         enemigo = new Personaje(hp_enemigo, ataque_enemigo, resistencia_enemigo, ppf_enemigo);
  56.  
  57.         simulador = new Simulador(jugador, enemigo);
  58.         simulador.pelear();
  59.     }
  60.  
  61.     cout << "El programa ha terminado su ejecucion con exito. Blablabla." << endl;
  62.     return 0;
  63. }

Bueno, son todos. Los archivos Simulador.cpp y Personaje.cpp compilan perfectamente con g++ -c, pero Main.cpp me da los siguientes errores:

Código:
Main.cpp: In function ‘int main()’:
Main.cpp:54:93: error: invalid user-defined conversion from ‘Personaje*’ to ‘const Personaje&’ [-fpermissive]
In file included from Main.cpp:6:0:
Personaje.h:7:5: note: candidate is: Personaje::Personaje(int, int, int, int) <near match>
Personaje.h:7:5: note:   no known conversion for argument 1 from ‘Personaje*’ to ‘int’
Main.cpp:54:93: error: invalid conversion from ‘Personaje*’ to ‘int’ [-fpermissive]
In file included from Main.cpp:6:0:
Personaje.h:7:5: error:   initializing argument 1 of ‘Personaje::Personaje(int, int, int, int)’ [-fpermissive]
Main.cpp:55:93: error: invalid user-defined conversion from ‘Personaje*’ to ‘const Personaje&’ [-fpermissive]
In file included from Main.cpp:6:0:
Personaje.h:7:5: note: candidate is: Personaje::Personaje(int, int, int, int) <near match>
Personaje.h:7:5: note:   no known conversion for argument 1 from ‘Personaje*’ to ‘int’
Main.cpp:55:93: error: invalid conversion from ‘Personaje*’ to ‘int’ [-fpermissive]
In file included from Main.cpp:6:0:
Personaje.h:7:5: error:   initializing argument 1 of ‘Personaje::Personaje(int, int, int, int)’ [-fpermissive]
Main.cpp:57:51: error: no match for ‘operator=’ in ‘simulador = (operator new(32u), (<statement>, ((Simulador*)<anonymous>)))’
Main.cpp:57:51: note: candidate is:
In file included from Main.cpp:7:0:
Simulador.h:6:7: note: Simulador& Simulador::operator=(const Simulador&)
Simulador.h:6:7: note:   no known conversion for argument 1 from ‘Simulador*’ to ‘const Simulador&’
Espero alguien pueda ayudarme, Saludos.
  #2 (permalink)  
Antiguo 27/12/2012, 07:33
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema con operador new y paso de objetos como argumentos

El error viene de aqui:

Código C++:
Ver original
  1. Simulador::Simulador(Personaje a, Personaje b)
  2.     : jugador(a),
  3.       enemigo(b)

Lo que haces es que jugador sea el personaje "a" y enemigo el personaje "b". Para ello lo que haces es llamar al constructor de ambas variables pasandoles como parametro un "Personaje". Es decir, que en realidad es como si hicieses esto (o es lo que el compilador intenta hacer y falla):

Código C++:
Ver original
  1. Simulador::Simulador(Personaje a, Personaje b)
  2. {
  3.    jugador = new Personaje(a);
  4.    enemigo = new Personaje(b);
  5. }

Como en tu clase Personaje no tienes ningún constructor para Personaje y que acepte un personaje de entrada... es lo que hace que falle.

Para arreglarlo tendrías que añadir este constructor (e implementarlo):

Código C++:
Ver original
  1. Personaje::Personaje(Personaje p);
__________________
Aviso: No se resuelven dudas por MP!

Etiquetas: argumentos, int, objetos, operador, paso, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:05.