Reservar memoria con new a una clase con varios elementos y constructor.

Iniciado por anonimo12121, 17 Febrero 2012, 02:05 AM

0 Miembros y 2 Visitantes están viendo este tema.

anonimo12121

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 (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
using namespace std;
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "personaje.hpp"
#include "rsc/gui.hpp"

int main(int *argc,char *argv[]){
   sf::Clock _tiempo;
   sf::Event evento;
   sf::Event eventovacio;
   int _wapp=640;
   int _happ=480;
   float FPS=60;
   float ftime;
   app.Create(sf::VideoMode(640,480,32),"Invasores del Espacio");
   _Declaracion();//botones
   while(1){
       if(_wapp!=app.GetWidth()||_happ!=app.GetHeight()){
           _wapp=app.GetWidth();
           _happ=app.GetHeight();
           app.Close();
           app.Create(sf::VideoMode(_wapp,_happ,32),"RESOLUTION CHANGED");
       }
       ftime=_tiempo.GetElapsedTime();
       if(ftime>1.0/FPS){
           _Eventos(app,evento);
           _Video(app,evento);
           _tiempo.Reset();
           //para que solo ocurra 1 evento seguido
           evento=eventovacio;
       }
   }
}

gui.hpp
Código (cpp) [Seleccionar]
sf::RenderWindow app;
Personaje *pj=new Personaje(app,"img/nave.png",true,100,100);
Personaje *enemy= new [10]Personaje(app,"img/enemy.png");
void _Declaracion()
{
};
void _Eventos(sf::RenderWindow &app,sf::Event &evento)
{
   app.GetEvent(evento);
   if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 256 || evento.Type== sf::Event::Closed)exit(1);
   if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 'p'){
   cout << "\n:::.PAUSED.:::\n";
   while(1){
       app.GetEvent(evento);
       if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 'p')break;
       if(evento.Type==sf::Event::KeyPressed && evento.Key.Code == 256 || evento.Type== sf::Event::Closed)exit(1);
       }
   }

}
void _Video(sf::RenderWindow &app,sf::Event &evento)
{
   pj->Print();
   app.Display();
};

personaje.hpp
Código (cpp) [Seleccionar]
class Personaje {
   private:
       sf::RenderWindow *_app;
       sf::Sprite _S;
       sf::Image _I;
       bool _ON;
   public:
       Personaje(sf::RenderWindow&,char*);
       Personaje(sf::RenderWindow &,char*,bool,float,float);
       sf::Sprite GetSprite() {return _S; }
       void Print() {if(_ON==true)_app->Draw(GetSprite());}
};
Personaje::Personaje(sf::RenderWindow &app,char *name){
   _app=&app;
   _ON=false;
   _I.LoadFromFile(name);
   _I.SetSmooth(false);
   _S.SetImage(_I);
};
Personaje::Personaje(sf::RenderWindow &app,char *name,bool on,float x,float y){
   _app=&app;
   _ON=on;
   _I.LoadFromFile(name);
   _I.SetSmooth(false);
   _S.SetImage(_I);
   _S.SetPosition(x,y);
};


PD: Espero solución gracias :)
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746


naderST

Si no me equivoco, no puedes usar el operador new[] para una clase que no tiene constructor por defecto... OJO no recuerdo bien.

BlackZeroX

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!¡.
The Dark Shadow is my passion.

x64core

Cita de: 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.
Que yo sepa todos las clases tienen un constructor por defecto, sino definimos uno el compilador crea uno por defecto

Eternal Idol

Initializing Objects Allocated with new.

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?

Código (cpp) [Seleccionar]
std::vector<Personaje> enemy(10, Personaje(app,"img/nave.png"));
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

anonimo12121

Osea tengo que hace lo que dice eterna Idol. Lo demás no funciona. Toca aprender Vector XD
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

naderST

Cita de: RHL en 17 Febrero 2012, 09:12 AM
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.