Forum: C++, plus/minus fel?

Forum huvudsida -> Programmering -> C++, plus/minus fel?

Sidor: 1

Till botten

olle 20:00 - 2:a Augusti 2006 | Post #1
Medlem
Inlägg: 57


Skicka PM
Har gjort en klass som ska fungera på detta sätt:

FancySequenceGenerator g() // starta på 0, inkrement 1
FancySequenceGenerator g(2) // starta på 2, inkrement 1
FancySequenceGenerator g(5, -3) // starta på 5, inkrement -3

Detta ska man sedan anropa genom att använda funktionsobjekt.

  1.  
  2. #include <vector>
  3. #include <iostream>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6. using namespace std;
  7.  
  8. class FancySequenceGenerator{
  9. public:
  10. FancySequenceGenerator() : current(0), ink(0) {}
  11. FancySequenceGenerator(int start) : current(start) {}
  12. FancySequenceGenerator(int start, int speed) : current(start), ink(speed) {}
  13. int operator() () { return current += ink ; }
  14. private:
  15. int current;
  16. int ink;
  17. };
  18.  
  19. template<class A,class Generate>
  20. void generate( vector<A> &v, int n, Generate gen ){
  21.  
  22. for ( int i=0; i < n;i++ )
  23. v.push_back(gen());
  24. }
  25.  
  26. int main(){
  27.  
  28. vector<int> v;
  29. generate(v,10,FancySequenceGenerator(2));
  30. PrintVector(v);
  31. return 0;
  32. }


Vid tex

generate(v,10,FancySequenceGenerator(2));

så blir utskriften:
[3,4,5,6,7,8,9,10,11,12]

och

generate(v,10,FancySequenceGenerator(2, -1));

[1,0,-1,-2,-3,-4,-5,-6,-7,-8]

Så jag har plus/minus fel. Det jag vill är att resultatet ska adderas efter att man har gjort return så att man får resultatet nästa gång man anropar operator(). tex som "current++". Tänkte kanske det finns någon liknande syntax i mitt fall?

ps: vill slippa if satser etc.. om det är möjligt


-------------------------
Ingen signatur!



Nissebosselasse 21:20 - 2:a Augusti 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Jag förstår inte riktigt vad du menar. Vill du att utskriften från:

generate(v,10,FancySequenceGenerator(2));

så blir utskriften:
[3,4,5,6,7,8,9,10,11,12]

...istället ska bli:

[2,3,4,5,6,7,8,9,10,11]

? I så fall är det inte svårare än att i klassens konstruktör(er) minska startvärdet (current) med stegvärdet (ink).

-------------------------
http://pushingcows.se
Gula Nallen

Senast redigerad 21:29 - 2:a Augusti 2006


olle 22:03 - 2:a Augusti 2006 | Post #3
Medlem
Inlägg: 57


Skicka PM
Exakt detta ville jag åstakomma. Inte visste jag att de skulle vara så lätt. Tack för hjälpen.

-------------------------
Ingen signatur!



Lajnold 03:15 - 11:a Augusti 2006 | Post #4
Medlem
Inlägg: 65


Skicka PM
Bättre tycker jag är att ändra int operator() (), eftersom det inte är värdet i klassen som är fel, utan det returnerade värdet (eftersom du värdet just innan du returnerar det). Att ändra på värdet konstruktorn då gör att om du någon gång skulle lägga till någon funktion som använder current så skulle det bli fel. ,,ven om det inte kommer att göras något sådant i det här fallet, så kan det vara bra att lära sig "rätt". Nu menar jag egentligen inte att Nissebosselasses lösning är "fel", men jag ser det mer som ett fulhack.

Jag skulle ha gjort int operator() () något sådant här istället.
int operator() () { int ret = current; current += ink; return ret; }


-------------------------
Ingen signatur!



Sidor: 1

Forum huvudsida -> Programmering -> C++, plus/minus fel?
Atom feed

Du får inte posta i den här tråden | Till toppen