2017-07-25 73 views
2

我学习如何使用函数,所以我创建了一个,我不明白为什么我的计数器变量在程序结束时为0。为什么我的函数成员变量“重置”? (C++)

这里的代码:

#include"stdafx.h" 
#include<iostream> 
#include<vector> 
#include<algorithm> 
#include<map> 
#include<list> 


using namespace std; 

class myFunctor { 
public: 
    myFunctor():counter(0) {} 
    void operator()(int i) { cout << "in the functor: " << i ; counter++; cout << " counter=" << counter << endl; } 
    int getCounter() const { return counter; } 
private: 
    int counter; 
}; 

int main() 
{ 
    vector<int> v{ 1,2,3,4,5,6,7,8,9,10 }; 
    myFunctor f; 

    for_each(v.begin(), v.end(), f); 

    cout << "counter=" << f.getCounter() << endl; 

    return 0; 
} 

这里是什么结果得出:

in the functor: 1 counter=1 
in the functor: 2 counter=2 
in the functor: 3 counter=3 
in the functor: 4 counter=4 
in the functor: 5 counter=5 
in the functor: 6 counter=6 
in the functor: 7 counter=7 
in the functor: 8 counter=8 
in the functor: 9 counter=9 
in the functor: 10 counter=10 
counter=0 
+1

你永远不actualy修改什么,但临时副本,为什么你会想到什么吗? –

回答

8

如果你在为for_each签名看看,你会看到,它由价值接受函子,因此在算法终止时,您在for_each内看到的更改不会反映到外部。

http://en.cppreference.com/w/cpp/algorithm/for_each

template< class InputIt, class UnaryFunction > 
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f); 

如果你想使这个工作,你将不得不使用std::ref生成参考包装和传递,通过价值。

std::for_each(vec.begin(), vec.end(), std::ref(functor)); 

看看的documentation for std::refreference_wrapper,看看如何以及为什么这个工程(关键的一点是,std::reference_wrapperoperator()与函子http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/operator()工作)。

+4

或者,也可以捕获'for_each'的返回值。 – templatetypedef

0

虽然好奇的答案是最好的解决办法,这里是另一个问题:

class myFunctor { 
public: 
    myFunctor():counter(std::make_shared<int>(0)) {} 
    void operator()(int i) { cout << "in the functor: " << i ; ++*counter; cout << " counter=" << *counter << endl; } 
    int getCounter() const { return *counter; } 
private: 
    std::shared_ptr<int> counter; 
}; 
相关问题