Funktionstemplate und Funktionszeiger
-
Hallo zusammen, ich habe wieder mal ein Problem wo ich nicht weiter komme, habe schon überall nach geguckt, und verstehe es immer noch nicht wie ich mein Problem lösen soll. Hoffe das mir jemand helfen kann.
Die Aufgabestellung lautet: Das eine Template-Funktion 3 Parameter übergeben bekommt, 1 und 2 Parameter sind Element bereiche eines Array[erstes Element und letztes Element], der 3. Parameter ist ein Funktionszeiger auf eine parameterlose Funktion "die bei mir als next() definiert ist", sie liefert mit jedem Aufruf ein Wert, der für das nächste Element im Bereich zugewiesen wird.
Die ganzen Funktionen sind bei mir in einer Klasse definiert StaticArray:
#pragma once #include <string> #include <vector> #include <iostream> #include <ctime> #include "Fraction.h" #include "Manager.h" template <class T, unsigned int MAX_SIZE> class StaticArray { private: T elems[MAX_SIZE]; public: void generate (T* pfirst, T* plast, T (*func)()){ for (; pfirst != plast; ++pfirst) {*pfirst = next();} }; T& next() { srand(time(NULL)); Fraction f; f.setrandom(); return f; } };Generat Funktion fängt ab ersten Element an zu zählen und mit der next() Funktion weise ich jedem Element den zufälligen Bruch zu.
Die zufällige Brüche werde auch erstellet mit der next() Funktion, dass stimmt glaube ich soweit.Mein Problem ist, dass ich die Funktion next() nicht übergeben kann in die Funktion generate(), ich weiß einfach nicht wie ich die generate() aufrufen soll.
In main.cpp versuche ich die Funktion generate() mit einem Objekt von meiner Klasse StaticArray wo auch die Funktion deklariert ist aufrufen:
using namespace std; int main(){ StaticArray <Fraction, 12> ArrayFraction; ArrayFraction.generate(&ArrayFraction[0],&ArrayFraction[12],next()); system("PAUSE"); return 0; };und dies funktioniert bei mir nicht, ich kann einfach nicht die next() Funktion in die generate () Funktion übergeben, ich weiß nicht was ich falsch mache, ich bitte um Hilfe

-
cobb schrieb:
Die Aufgabestellung lautet: Das eine Template-Funktion 3 Parameter übergeben bekommt, 1 und 2 Parameter sind Element bereiche eines Array[erstes Element und letztes Element], der 3. Parameter ist ein Funktionszeiger auf eine parameterlose Funktion "die bei mir als next() definiert ist", sie liefert mit jedem Aufruf ein Wert, der für das nächste Element im Bereich zugewiesen wird.
Also eine Funktion mit Start-End Iterator-Paar, dass von einer Factoryfunction Werte bekommt. Dann ma los hier! C++11 Lösung:
template<typename i_t, typename functor_t> void compute(i_t start, i_t end, functor_t f) { std::for_each(start, end, [&](decltype(*i_t) &a){a = f();}); }Ideone.
Ohne C++11 hab ich keinen Plan... (nicht wegen den Lambdas, haha)
War aber nur ein Denkansatz.Edit: Natürlich nehme ich an, dass es irrelevant ist, dass der letzte Iterator auf das Element nach dem letzten zu bearbeitendem ist? Und das der Wert des/der Funktors/Funktion nicht für das nächste, sondern für das (von der Schleife aus gesehen) aktuelle?
-
-
Maxi schrieb:
Hä? Er soll selbst eine schreiben, sonst hätt' das doch schon längst jemand geschrieben

-
cobb schrieb:
der 3. Parameter ist ein Funktionszeiger auf eine parameterlose Funktion
...
Die ganzen Funktionen sind bei mir in einer Klasse definiert StaticArray:... class StaticArray { ... T& next() { ... } };Als nichtstatische Memberfunktion ist dein next nicht so parameterlos wie du meinst.
-
Hacker, danke für deine Mühe, ich muss leider gestehen, dass ich nicht wirklich dein Code nachvollziehen kann. Ja das ist schon richtig es muss der aktuelle Bereich (Element)..... mit dem Wert aufgefüllt werden. Der letzte Iterator soll einfach auf den letzten Element zeigen in einem Array.
-
Hallo camper, ich verstehe nicht ganz was du damit meinst, es werden ja keine Parameter übergeben bei der Funktion next(); wie ich dass verstehe. Wenn es Parameter übergeben bekommen hätte, würde es doch z.b. so aussehen " next(int a, int b)" oder nicht?
-
Hacker schrieb:
Maxi schrieb:
Hä? Er soll selbst eine schreiben, sonst hätt' das doch schon längst jemand geschrieben

Naja, unter dem Link steht sogar der Quelltext für so eine Funktion, deshalb hab ich den rausgesucht
-
cobb schrieb:
Hallo camper, ich verstehe nicht ganz was du damit meinst, es werden ja keine Parameter übergeben bei der Funktion next(); wie ich dass verstehe. Wenn es Parameter übergeben bekommen hätte, würde es doch z.b. so aussehen " next(int a, int b)" oder nicht?
Und was meinst du was das
thisinthis.next()ist?
Klar, du schreibst es nicht hin, aber übergeben wird es trotzdem.Zusätzlich ist noch die Syntax mit der du "next" übergeben willst falsch:
cobb schrieb:
StaticArray <Fraction, 12> ArrayFraction; ArrayFraction.generate(&ArrayFraction[0],&ArrayFraction[12],next());next()ist ein Funktionsaufruf, kein Funktionszeiger und auch kein Memberfunktionszeiger.
Memberfunktionszeiger wäre&StaticArray::next.Deine Probleme stammen grösstenteils daher, dass du auf die etwas komische Idee gekommen bist alles in eine Klasse reinstecken zu müssen. Und halt noch dazu als nicht-statische Member.
In C++ kann man auch Funktionen machen, so ganz ohne Klassen. Nennt man dann freie Funktionen.
In der Aufgabenstellung steht auch nix davon dass du das Array selbst bereitstellen sollst, und schon gar nix davon dass du die Grösse des Arrays beschränken sollst.
-
@Hacker
Wo liest du aus der Aufgabenstellung raus dass mit Iteratoren gearbeitet werden soll? Oder dass das Intervall halb-offen ist? Oder dass er allgemeine Funktoren unterstützen soll (da steht ganz Klar Funktionszeiger)?Aber hauptsache mal was gepostet, nen.
-
hustbaer schrieb:
@Hacker
Wo liest du aus der Aufgabenstellung raus dass mit Iteratoren gearbeitet werden soll? Oder dass das Intervall halb-offen ist? Oder dass er allgemeine Funktoren unterstützen soll (da steht ganz Klar Funktionszeiger)?Aber hauptsache mal was gepostet, nen.
Lol
Ok, dann pass mal auf.
@Maxi: Hab jetzt den Inhalt vonstd::generategenommen, aber die Funktiongeneratean sich gefällt Hustbaer offensichtlich genausowenig wie meine.template<typename i_t> void compute(i_t* start, i_t* end, i_t (*f)()) { do *start = f(); while(start++ != end); }
-
hustbaer, d.h. dass ich am besten die Funktion next() als globale Funktion machen soll und nicht in einer Klasse mit der generat(), verstehe ich dich richtig???
-
genau die Funktion sollte global sein.
-
danke demonking, werde ich gleich ausprobieren.....