7
Recientemente he empezado a enseñarme la biblioteca de plantillas estándar. Tenía curiosidad de por qué el método GetTotal() en esta clase está devolviendo 0?functor return 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;
}
Eso es contador intuitivo. ¿Sabes por qué lo hicieron de esa manera? –
Es porque c está en la pila y se pasa por valor a for_each, por lo que se pasa una copia de c. No tiene nada que ver con for_each (aparte de que se necesita un funtor en lugar de un puntero a un funtor), sino con la semántica del lenguaje. En cuanto a por qué se necesita un funtor y no un puntero a un funtor podría estar relacionado con que también sea capaz de tomar un puntero a una función, de modo que pase lo que pase, para cada uno puede llamarse f(). Pero esa parte es solo una suposición –
@Mark: No lo sé en realidad. Podrían haberlo hecho una referencia y no debería haber ningún problema. No puedo pensar en una situación en la que ser una referencia me sorprenda tampoco. Tengo curiosidad también. @Brandon: Él no está preguntando qué significa mi respuesta. Quiere decir "¿por qué no lo diseñaron para tomar la función por referencia en lugar de por valor?" :) – GManNickG