Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/12/2012, 22:17
reethok
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años, 6 meses
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.