Recentemente ho iniziato a insegnare a me stesso la libreria di modelli standard. Ero curioso di sapere perché il metodo GetTotal() in questa classe restituisce 0?functor che restituisce 0
...
class Count
{
public:
Count() : total(0){}
void operator() (int val){ total += val;}
int GetTotal() { return total;}
private:
int total;
};
void main()
{
set<int> s;
Count c;
for(int i = 0; i < 10; i++) s.insert(i);
for_each(s.begin(), s.end(), c);
cout << c.GetTotal() << endl;
}
Questo è contro intuitivo. Sai perché l'hanno fatto in quel modo? –
È perché c è nello stack e viene passato per valore a for_each, quindi viene passata una copia di c. Non ha nulla a che fare con for_each (altro poi ci vuole un functor invece di un puntatore a un functor), ma invece con la semantica del linguaggio. Per quanto riguarda il motivo per cui un functor e un puntatore a un functor potrebbero essere collegati ad esso, è anche in grado di prendere un puntatore a una funzione, così che indipendentemente da ciò che viene passato, for_each può chiamare f(). Ma quella parte è solo un'ipotesi –
@Mark: non lo so davvero. Avrebbero potuto essere un riferimento e non dovrebbero esserci problemi. Non riesco a pensare a una situazione in cui essere un riferimento mi sorprenderebbe. Anch'io sono curioso. @Brandon: non sta chiedendo cosa significa la mia risposta. Intende "perché non l'hanno progettato per prendere la funzione per riferimento invece che per valore?" :) – GManNickG