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 addierenjetzt 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
}
oderder 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 verlorenaber 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 mitdelete... blabalawie lautet der genaue code ..

in dem fall.
reicht dadelete 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;