std::for_each mit eigener funktion aufrufen funktioniert nicht ...warum?



  • ich habe ein kleines problemchen
    Ich habe eine Klasse Town mit diversen methoden unter anderem die Methode
    void grow()
    {
    ++money;
    ++reasearch;
    .. usw
    } sie soll verschiedene attribute des Objektes addieren

    jetzt habe ich eine main geschrieben ..

    #include "stdafx.h"
    #include <conio.h>// für _getch().. voerst nicht gebraucht
    #include<string>
    using std::getline;
    using std::string;
    #include <iostream>
    using std::cout;
    using std::cin;
    using std::endl;
    using std::cerr;
    using std::cin;
    #include<list>
    #include <iterator>
    #include <algorithm>
    #include "Town.h"
    typedef std::list<Town> Townlist;
    int main()
    {
    	Townlist Towns;
    	std::ostream_iterator<Town> output(cout, " ");
    	Town *pTown;
    
    	pTown=new Town("Heidelberg");
    	pTown->grow(); // funktioniert .
    	Towns.push_back(*pTown);
    	pTown=new Town("Mannheim");
    	Towns.push_back(*pTown);
    	std::copy(Towns.begin(),Towns.end(), output);
    
    	//Auf alle Objekte grow() anwenden.
        std::for_each(Towns.begin(),Towns.end(), pTown->grow());//funtktioniert
    // nicht for_each soll auf alle in der Liste befindlichen objekte grow() //anwenden. und deren attribute addieren
    ...
    return 0;
    

    gibt fehler :
    error C2784: "_Fn1 std::for_each(_InIt,_InIt,_Fn1)": template-Argument für "_Fn1" konnte nicht von "void" hergeleitet werden.
    c:\programme\microsoft visual studio 8\vc\include\algorithm(22): Siehe Deklaration von 'std::for_each'

    ich dachte die for_each-funktion wendet nun auf alle in der liste gespeicherten objekte die methode grow() an. leider gehts nicht hat jemand eine lösung?



  • #include <functional>
    
    std::for_each(Towns.begin(),Towns.end(), std::mem_fun(&Town::grow));
    


  • http://www.cplusplus.com/reference/algorithm/for_each.html

    Grow muss ein "Town" als Argument haben.



  • Checker&Murckser schrieb:

    http://www.cplusplus.com/reference/algorithm/for_each.html

    Grow muss ein "Town" als Argument haben.

    was meinst du?
    //grow ist methode von klasse Town
    void grow(Town &) //hab ich probiert auch compiler_meckern..
    {
    ++money;
    ++reasearch;
    .. usw
    }
    oder

    der aufruf
    std::for_each(Towns.begin(),Towns.end(), std::mem_fun(&Town::grow**(.hier was?.)**);
    oder was hast du gemeint?



  • sten schrieb:

    oder was hast du gemeint?

    Schau Dir doch evtl. mal die Antwort von finix an.



  • #include <iostream>
    #include <list>
    #include <iterator>
    #include <algorithm>
    #include "Town.h"
    
    void grow(const Town&);
    
    int main()
    {
        std::list<Town> Towns;
        Towns.push_back(Town("Heidelberg"));
        Towns.push_back(Town("Mannheim"));
        std::copy(Towns.begin(),Towns.end(), std::ostream_iterator<Town> output(std::cout, " "));
        std::for_each(Towns.begin(),Towns.end(), grow);
        std::copy(Towns.begin(),Towns.end(), std::ostream_iterator<Town> output(std::cout, " "));
    };
    
    void grow(const Town& town)
    {
        town.grow();
    }
    

    ?!



  • sten schrieb:

    der aufruf
    std::for_each(Towns.begin(),Towns.end(), std::mem_fun(&Town::grow**(.hier was?.)**);
    oder was hast du gemeint?

    Oops. Hatte nur das pTown->grow() gesehen, dachte du hantierst mit Pointern.

    std::for_each(Towns.begin(),Towns.end(), std::mem_fun_ref(&Town::grow))
    


  • (D)Evil schrieb:

    #include <iostream>
    #include <list>
    #include <iterator>
    #include <algorithm>
    #include "Town.h"
    
    void grow( Town&); 
    
    int main() 
    { 
        std::list<Town> Towns; 
        Town* pTown; 
    	std::ostream_iterator<Town>output(cout, " ");
    
        pTown=new Town("Heidelberg"); 
        Towns.push_back(*pTown); 
        pTown=new Town("Mannheim"); 
        Towns.push_back(*pTown); 
       
        std::for_each(Towns.begin(),Towns.end(), grow); 
        std::copy(Towns.begin(), Towns.end(),output);
    }; 
    
    void grow( Town& town) 
    { 
        town.grow(); 
    }
    

    ?!

    👍 👍 👍
    danke aber das ganze geht nur ohne const weil sonst:
    error C2662: 'Town::grow': this-Zeiger kann nicht von 'const Town' in 'Town &' konvertiert werden
    Durch die Konvertierung gehen Qualifizierer verloren

    aber trotzdem danke konnte nicht um die ecke denken



  • hmm aber das mit mem_fun_ptr sollte auch gehen 🙂 wäre etwas einfacher 😉



  • Oops. Hatte nur das pTown->grow() gesehen, dachte du hantierst mit Pointern.

    C/C++ Code:
    std::for_each(Towns.begin(),Towns.end(), std::mem_fun_ref(&Town::grow))

    thx finix 👍 👍 👍

    noch eine sache ... hmm ich belege jetzt dynamischen speicher, ich denke
    am ende des programms sollte man den wieder freigeben.
    geht irgendwie mit

    delete... blabala
    

    wie lautet der genaue code .. 🙂
    in dem fall.
    reicht da

    delete pTown;
    

    weil ich hab ja eigentlich mehrere objekte.?



  • nja ... ist nen bissel dumm was du da machst ... da du die Objekte beim einfügen ja wieder kopierst ...

    pTown=new Town("Heidelberg");
    Towns.push_back(*pTown); 
    delete pTown;
    pTown=new Town("Mannheim");
    Towns.push_back(*pTown); 
    delete pTown;
    

Anmelden zum Antworten