Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: anonimo12121 en 17 Febrero 2012, 02:05 am



Título: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: anonimo12121 en 17 Febrero 2012, 02:05 am
Buenas quería saber cual es el problema de esto.

Personaje *enemy= new[10] Personaje(app,"img/enemy.png");

Me da este error.
error: expected identifier before '[' token|
|3|error: expected `,' or `;' before "Personaje"|
 
Lo que pienso es que no se puede reservar memoria dándole un constructor.
Pongo aquí el código por si me estoy equivocando.
main.cpp
Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. #include <SFML/Window.hpp>
  5. #include <SFML/Graphics.hpp>
  6. #include "personaje.hpp"
  7. #include "rsc/gui.hpp"
  8.  
  9. int main(int *argc,char *argv[]){
  10.    sf::Clock _tiempo;
  11.    sf::Event evento;
  12.    sf::Event eventovacio;
  13.    int _wapp=640;
  14.    int _happ=480;
  15.    float FPS=60;
  16.    float ftime;
  17.    app.Create(sf::VideoMode(640,480,32),"Invasores del Espacio");
  18.    _Declaracion();//botones
  19.    while(1){
  20.        if(_wapp!=app.GetWidth()||_happ!=app.GetHeight()){
  21.            _wapp=app.GetWidth();
  22.            _happ=app.GetHeight();
  23.            app.Close();
  24.            app.Create(sf::VideoMode(_wapp,_happ,32),"RESOLUTION CHANGED");
  25.        }
  26.        ftime=_tiempo.GetElapsedTime();
  27.        if(ftime>1.0/FPS){
  28.            _Eventos(app,evento);
  29.            _Video(app,evento);
  30.            _tiempo.Reset();
  31.            //para que solo ocurra 1 evento seguido
  32.            evento=eventovacio;
  33.        }
  34.    }
  35. }
gui.hpp
Código
  1. sf::RenderWindow app;
  2. Personaje *pj=new Personaje(app,"img/nave.png",true,100,100);
  3. Personaje *enemy= new [10]Personaje(app,"img/enemy.png");
  4. void _Declaracion()
  5. {
  6. };
  7. void _Eventos(sf::RenderWindow &app,sf::Event &evento)
  8. {
  9.    app.GetEvent(evento);
  10.    if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 256 || evento.Type== sf::Event::Closed)exit(1);
  11.    if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 'p'){
  12.    cout << "\n:::.PAUSED.:::\n";
  13.    while(1){
  14.        app.GetEvent(evento);
  15.        if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 'p')break;
  16.        if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 256 || evento.Type== sf::Event::Closed)exit(1);
  17.        }
  18.    }
  19.  
  20. }
  21. void _Video(sf::RenderWindow &app,sf::Event &evento)
  22. {
  23.    pj->Print();
  24.    app.Display();
  25. };
  26.  
personaje.hpp
Código
  1. class Personaje {
  2.    private:
  3.        sf::RenderWindow *_app;
  4.        sf::Sprite _S;
  5.        sf::Image _I;
  6.        bool _ON;
  7.    public:
  8.        Personaje(sf::RenderWindow&,char*);
  9.        Personaje(sf::RenderWindow &,char*,bool,float,float);
  10.        sf::Sprite GetSprite() {return _S; }
  11.        void Print() {if(_ON==true)_app->Draw(GetSprite());}
  12. };
  13. Personaje::Personaje(sf::RenderWindow &app,char *name){
  14.    _app=&app;
  15.    _ON=false;
  16.    _I.LoadFromFile(name);
  17.    _I.SetSmooth(false);
  18.    _S.SetImage(_I);
  19. };
  20. Personaje::Personaje(sf::RenderWindow &app,char *name,bool on,float x,float y){
  21.    _app=&app;
  22.    _ON=on;
  23.    _I.LoadFromFile(name);
  24.    _I.SetSmooth(false);
  25.    _S.SetImage(_I);
  26.    _S.SetPosition(x,y);
  27. };

PD: Espero solución gracias :)


Título: Re: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: x64core en 17 Febrero 2012, 02:14 am
http://en.wikipedia.org/wiki/New_(C%2B%2B)


Título: Re: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: naderST en 17 Febrero 2012, 04:23 am
Si no me equivoco, no puedes usar el operador new[] para una clase que no tiene constructor por defecto... OJO no recuerdo bien.


Título: Re: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: BlackZeroX en 17 Febrero 2012, 04:32 am
Personaje *enemy= new[10] Personaje(app,"img/enemy.png");

mmm no se pero prueba con esto...


Personaje *enemy= new Personaje[10] (app,"img/enemy.png");

o asi;

Personaje *enemy= new Personaje[10] {(app,"img/enemy.png")};

mmm no recuerdo bien... y bueno la cosa es meterle mano... igual releernos la sintasix...

Dulces Lunas!¡.


Título: Re: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: x64core en 17 Febrero 2012, 09:12 am
Si no me equivoco, no puedes usar el operador new[] para una clase que no tiene constructor por defecto... OJO no recuerdo bien.
Que yo sepa todos las clases tienen un constructor por defecto, sino definimos uno el compilador crea uno por defecto


Título: Re: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: Eternal Idol en 17 Febrero 2012, 09:55 am
Initializing Objects Allocated with new (http://msdn.microsoft.com/en-us/library/cb6bd5ek.aspx).

No explicit per-element initialization can be done when allocating arrays using the new operator; only the default constructor, if present, is called. See Default Arguments for more information.

[10.5] Which constructor gets called when I create an array of Fred objects? (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.5)

Código
  1. std::vector<Personaje> enemy(10, Personaje(app,"img/nave.png"));


Título: Re: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: anonimo12121 en 17 Febrero 2012, 11:30 am
Osea tengo que hace lo que dice eterna Idol. Lo demás no funciona. Toca aprender Vector XD


Título: Re: Reservar memoria con new a una clase con varios elementos y constructor.
Publicado por: naderST en 17 Febrero 2012, 15:39 pm
Que yo sepa todos las clases tienen un constructor por defecto, sino definimos uno el compilador crea uno por defecto

Es correcto, pero eso sucede solo si no has definido un constructor y él ya definió uno.