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

Problemas de uso de std::for_each

Estas en el tema de Problemas de uso de std::for_each en el foro de C/C++ en Foros del Web. Buenas! He intentado usar un std::for_each para iterar a traves de los elementos de un list. El problemas es que no consigo que funcione. Este ...
  #1 (permalink)  
Antiguo 01/10/2012, 11:15
 
Fecha de Ingreso: septiembre-2012
Mensajes: 38
Antigüedad: 11 años, 6 meses
Puntos: 0
Problemas de uso de std::for_each

Buenas!
He intentado usar un std::for_each para iterar a traves de los elementos de un list. El problemas es que no consigo que funcione.
Este es el código:

Código:
void GameScreen::Draw(void)
{
    std::for_each(
                  components.begin(),
                  components.end(),
                  myfunction
                  );
}

void myfunction(Component cpt)
{
    if(cpt.IsVisible)
        cpt.Draw();
}
Y este el error que me da:

error: argument of type 'void (GameScreen::)(Component)' does not match 'void (GameScreen::*)(Component)'

También intente hacerlo con una función lambda:

Código:
void GameScreen::Draw(void)
{
    std::for_each(
                  components.begin(),
                  components.end(),
                  [](Component cpt)
                  {
                      if(cpt.IsVisible)
                        cpt.Draw();
                  }
                  );
}
Pero en este caso me devuelve estos errores:

error: expected primary-expression before '[' token
error: expected primary-expression before ']' token
error: expected primary-expression before 'cpt'


¿ Alguna idea ?
  #2 (permalink)  
Antiguo 02/10/2012, 00:57
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 4 meses
Puntos: 52
Respuesta: Problemas de uso de std::for_each

¿Podrías poner el código completo?
no estoy seguro de que el problema se encuentre en sólo esas lineas.

Saludos
  #3 (permalink)  
Antiguo 02/10/2012, 09:16
 
Fecha de Ingreso: septiembre-2012
Mensajes: 38
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problemas de uso de std::for_each

Aqui el codigo completo:

GameScreen.hpp

Código:
#ifndef GAMESCREEN_H
#define GAMESCREEN_H

#include <string>
#include <list>
#include <iostream>
#include <algorithm>
#include "Component.hpp"

using namespace std;

class Engine;

class GameScreen
{

    public:
        void setEngine(Engine* engine);
        Engine* getEngine(void);

        void setName(const string name);
        string getName(void) const;

        void AddComponent(Component component);
        void RemoveComponent(Component component);

        void LoadGameScreen(void);

        virtual void Draw(void);
        virtual void Update(void);

        // Sobrescribimos el operador == para poder hacer nuestra propia comparacion
        // friend: no pertenece a la clase, pero puede usar sus miembros
        friend bool operator == (const GameScreen &gs1, const GameScreen &gs2) ;
        GameScreen& operator = (const GameScreen &gs) ;

    protected:
        virtual void Load(void);

    private:

        string name;
        Engine* engine;
        std::list<Component> components;
        bool loaded;

        void PutComponentInOrder(Component component);

        void myfunction(Component cpt);
};

struct CompareGS : public std::binary_function < GameScreen, GameScreen, bool>
        {
            bool operator() (const GameScreen& gs1, const GameScreen value) const
            {
                return (gs1 == value);
            }
        };

#endif // GAMESCREEN_H
GameScreen.cpp

Código:
#include "../../include/GameScreen.hpp"

string GameScreen::getName(void) const
{
    return name;
}

void GameScreen::setName(const string n_name)
{
    name == n_name;
}

Engine* GameScreen::getEngine(void)
{
    return engine;
}

void GameScreen::setEngine(Engine* n_engine)
{
    engine = n_engine;
}

void GameScreen::AddComponent(Component n_cpt)
{

}

void GameScreen::RemoveComponent(Component cpt)
{

}

void GameScreen::PutComponentInOrder(Component n_cpt)
{
    // Buscamos el componente. // ESCRIBIR LOS OPERADORES EN COMPONENT '==', '=' Y LA FUNCION CompareCPT()
    list<Component>::iterator result = find_if(
                                          components.begin(),
                                          components.end(),
                                          bind2nd<CompareCPT>(CompareCPT(),n_cpt);
    if(result != components.end())
    {
        components.remove(n_cpt);

        // En C++, para tocar las narices, no se puede iterar asi:
        //list[i]. En su lugar debe hacerse a traves de std::advance
        //y una variable del tipo de list inicializada en el principio.
        Component& c = *components.begin();
        // itera a traves de los componentes en orden hasta encontrar uno
        // con un valor mas alto o igual, y lo insertamos en esa posicion
        register int i = 0;
        for(i = 0; i < components.size(); i++)
        {
            std::advance(c,i);
            //Component actual_c = *c;
            if(c.DrawOrder >= n_cpt.DrawOrder)
                break;
        }
        components.insert(i,n_cpt);

    }
}

void GameScreen::LoadGameScreen(void)
{
    // Si ya hemos cargado el GameScreen, retornamos
    if (loaded)
        return;

    // Pasamos el GameScreen a modo cargado
    loaded = true;

    // Cargamos el GameScreen
    Load();
}

void GameScreen::Update(void)
{

}

void GameScreen::Draw(void)
{
    std::for_each(
                  components.begin(),
                  components.end(),
                  [](Component cpt)
                  {
                      if(cpt.IsVisible)
                        cpt.Draw();
                  }
                  );
}




bool operator == (const GameScreen &gs1, const GameScreen &gs2)
{
    return (
            gs1.getName() == gs2.getName()
            );
};

GameScreen& GameScreen::operator = (const GameScreen &gs)
{
    if (this == &gs)
        return *this;

    name = gs.name;
    engine = gs.engine;
    loaded = gs.loaded;
    components = gs.components;
    return *this;
};
  #4 (permalink)  
Antiguo 03/10/2012, 22:04
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 4 meses
Puntos: 52
Respuesta: Problemas de uso de std::for_each

Bueno, para ser sincero, no encuentro donde está el error.

Podría ser que no definiste el prototipo de la función antes del for_each, o tal vez un error de Componente.

En qué linea te da el error?

Saludos
  #5 (permalink)  
Antiguo 04/10/2012, 10:45
 
Fecha de Ingreso: septiembre-2012
Mensajes: 38
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problemas de uso de std::for_each

Usando la función lambda ( que es la opción que mas me interesa) me da el error en la linea 106
  #6 (permalink)  
Antiguo 04/10/2012, 22:49
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 4 meses
Puntos: 52
Respuesta: Problemas de uso de std::for_each

El problema esta en que yo no se cual es tu linea 106.

Preferiría que probaras sin la función lambda primero, y una vez que encontremos el problema lo cambies.

Saludos

Etiquetas: foreach, for_each, iteration
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 20:27.