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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Problema] Lista de inicialización de una estrucura..... (Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Problema] Lista de inicialización de una estrucura..... (Solucionado)  (Leído 2,590 veces)
xRodak

Desconectado Desconectado

Mensajes: 19


Ver Perfil
[Problema] Lista de inicialización de una estrucura..... (Solucionado)
« en: 19 Enero 2014, 19:39 pm »

Hola ! Llevo 2 días intentando reparar un error, y creo que ya estoy muy cerca de lograrlo, pero ya no doy más, así que les pido ayuda.

Sucede que tengo los siguientes errores

Código:
|323|error: expected class-name before '(' token
|323|error: expected '{' before '(' token
|324|error: expected constructor, destructor, or type conversion before ',' token
|324|error: expected constructor, destructor, or type conversion before '(' token

(El problema se presenta en la clase State, en la estructura Context, y en sus respectivos contructores, así que pueden ignorar el resto de las clases que desconozcan, las puse para que se entienda de qué trata el código.)

Mi código es de este estilo:

Código:
class State
{

    public:
        struct Context
        {
            //Constructor
            Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player);
            sf::RenderWindow* window;
            TextureHolder* textures;
            FontHolder* fonts;
            Player* player;
        };

    public:
        State(StateStack& stack, Context context);
        virtual ~State();
    private:
        Context mContext;
};


//Constructor de la estructura Context que está dentro de la clase State
//Este contructor debería guardar referencias (o punteros) a los recursos obtenidos por argumento
State::Context::Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player)
//Lista de inicialización
: State::Context::window(window)                        //Linea 323
, State::Context::textures(textures)                        //Linea 324
, State::Context::fonts(fonts)
, State::Context::player(player)
{

}

State::State(StateStack& stack, State::Context context)
//Lista de inicialización 2, llama al constructor de Contexto
: mContext(State::Context(*(context.window),*(context.textures),*(context.fonts),*(context.player)))
{

}

Según lo que tengo entendido, la lista de inicialización del contructor de Context debería estar correcta, pero ambas en conjuntos me entra la duda. Podría alguien decirme donde está el error en las listas de inicialización, o si debo utilizar otra forma para resolver el problema?

Muchas gracias de antemano.


« Última modificación: 20 Enero 2014, 15:42 pm por xRodak » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [Problema] Lista de inicialización de una estrucura al interior de una clase
« Respuesta #1 en: 19 Enero 2014, 23:28 pm »

El parametro window es un objeto, pero en la estructura lo tienes declarado como un puntero. Lo mismo con las texturas y las fuentes.

Mi consejo esque cambies los punteros por referencias:
Código
  1. struct Context
  2. {
  3.    //Constructor
  4.    Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player);
  5.    sf::RenderWindow& window;
  6.    TextureHolder& textures;
  7.    FontHolder& fonts;
  8.    Player& player;
  9. };
  10.  

Eso si debería irte, también puedes dejarlos como punteros y hacer esto:

Código
  1. State::Context::Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player)
  2. //Lista de inicialización
  3. : State::Context::window(&window)
  4. , State::Context::textures(&textures)
  5. , State::Context::fonts(&fonts)
  6. , State::Context::player(&player)
  7. {
  8.  
  9. }

Pero son bastantes más comodas las referencias, te olvidas poner el * o los -> cada vez que vayas a usarlo.


« Última modificación: 19 Enero 2014, 23:30 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
xRodak

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Problema] Lista de inicialización de una estrucura al interior de una clase
« Respuesta #2 en: 20 Enero 2014, 00:52 am »

Gracias por el consejo,  lo arreglaré apenas solucione el problema principal.

Ya pude avanzar algo con el problema, lo que sucede ahora, es que, no sé como llamar al constructor de la estructura interior. El códido que tengo es el siguiente:

Código:
class State
{
    public:
        typedef std::unique_ptr<State> Ptr;
        struct Context
        {
            Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player);
            sf::RenderWindow* window;
            TextureHolder* textures;
            FontHolder* fonts;
            Player* player;
        }Nested;

    public:
        State(StateStack& stack, Context context);
        virtual ~State();
        virtual void draw() = 0;
        virtual bool update(sf::Time dt) = 0;
        virtual bool handleEvent(const sf::Event& event) = 0;
    protected:
        void requestStackPush(States::ID stateID);
        void requestStackPop();
        void requestStateClear();
        Context getContext() const;
    private:
        StateStack* mStack;
        Context mContext;
};

State::Context::Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player)
:window(&window),
textures(nullptr),
fonts(nullptr),
player(nullptr)
{

}

State::State(StateStack& stack, State::Context context)
//EL ERROR ESTÁ EN ESTA LINEA, DEBO LLAMAR AL CONTRUCTOR DE 'Context' entregando 4 argumentos

//:Context(*(context.window),*(context.textures),*(context.fonts),*(context.player))
//:State::Context(*(context.window),*(context.textures),*(context.fonts),*(context.player))
: Nested(*(context.window),*(context.textures),*(context.fonts),*(context.player))
{

}

He intentado llamar al contructor de diversas formas. El error reside en que el emulador me señala que estoy contruyendo un Context entregando 0 argumentos, en donde me señala que este pide 4 argumentos (claro, así está definido su contructor). Por lo que deduje, que no estoy llamando correctamente  al constructor, por lo que el emulador lo llama automaticamente entregándole 0 argumentos.

Alguien sabe como llamo al contructor de al estructura interior Context desde el contructor de State?
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [Problema] Lista de inicialización de una estrucura al interior de una clase
« Respuesta #3 en: 20 Enero 2014, 01:05 am »

Código
  1. State::State(StateStack& stack, State::Context context)

Pasa ese context por referencia y usa el constructor copia para inicializar tu Context:

Código
  1. State::State(StateStack& stack, State::Context &context) : mContext(context)
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
xRodak

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Problema] Lista de inicialización de una estrucura al interior de una clase
« Respuesta #4 en: 20 Enero 2014, 01:31 am »

Edito.

Ya estoy viendo la luz, había confundido una nested class con herencia. No necesitaba un inicializador para mi caso. Lo solucioné de la forma que me mencionaste, pero haciendo otr pequeño cambio. Ahora tengo un nuevo problema, no sé a que refiere, busqué en google pero no encontré mucho.

Este es mi nuevo código y el nuevo error:

Código:
class State
{
    public:
        typedef std::unique_ptr<State> Ptr;
        struct Context
        {
            Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player);
            sf::RenderWindow* window;
            TextureHolder* textures;
            FontHolder* fonts;
            Player* player;
        };

    public:
        State(StateStack& stack, Context context);
        virtual ~State();
        virtual void draw() = 0;
        virtual bool update(sf::Time dt) = 0;
        virtual bool handleEvent(const sf::Event& event) = 0;
    protected:
        void requestStackPush(States::ID stateID);
        void requestStackPop();
        void requestStateClear();
        Context getContext() const;
    private:
        StateStack* mStack;
        Context mContext;
};

State::Context::Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player)
:window(&window),
textures(nullptr),
fonts(nullptr),
player(nullptr)
{

}

State::State(StateStack& stack, State::Context context)
: mContext(context)
{

}
Código:
In function `ZN5StateC2ER10StateStackNS_7ContextE':|
undefined reference to `vtable for State'|

Gracias por leer y por la ayuda.
« Última modificación: 20 Enero 2014, 01:59 am por xRodak » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [Problema] Lista de inicialización de una estrucura al interior de una clase
« Respuesta #5 en: 20 Enero 2014, 11:51 am »

Código
  1. State::State(StateStack& stack, State::Context context)
  2. : mContext(context)
  3. {
  4.  
  5. }

Te dije que pasaras el Context por referencia:

Código
  1. State::State(StateStack& stack, State::Context &context)
  2. : mContext(context)
  3. {
  4.  
  5. }

Y en cuanto al error. ¿Seguro que no es un tema de archivos?
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
xRodak

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Problema] Lista de inicialización de una estrucura al interior de una clase
« Respuesta #6 en: 20 Enero 2014, 15:41 pm »

Listo, lo cambié a referencia.

El último error tenia que ver con el destructor virtual de la clase, había olvidado definir el destructor virtual no puro.

Muchas gracias por la ayuda ! Problemas resueltos !
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PIC C inicializacion
Programación C/C++
crema3000 1 2,026 Último mensaje 8 Septiembre 2010, 16:15 pm
por Debci
[Solucionado] Ayuda con Lista Ligada
.NET (C#, VB.NET, ASP)
DaNuK 8 5,620 Último mensaje 22 Octubre 2010, 20:43 pm
por DaNuK
[Solucionado] Problema con lista enlazada en C (buffer de entrada) « 1 2 »
Programación C/C++
xassiz~ 12 10,073 Último mensaje 21 Febrero 2011, 22:22 pm
por xassiz~
Mostrar en forma de lista! [solucionado]
Programación C/C++
;c1v!c 4 2,810 Último mensaje 30 Enero 2012, 14:36 pm
por ;c1v!c
Asignaciones e inicializacion de constructores..
Programación C/C++
digimikeh 7 2,036 Último mensaje 23 Junio 2019, 06:00 am
por digimikeh
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines