std :: for_each 및 functor 프록시 개체에 다음과 같은 문제가 있습니다. 다음 코드를 참조하십시오 : 위부터std :: for_each 및 std :: vector 소멸자 호출
struct Functor {
std::vector<int> data;
const unsigned mID;
static unsigned id;
Functor() : mID(id++) {
std::cout << "Functor constructed with id: " << mID << std::endl;
}
~Functor() {
std::cout << "Functor dtor: " << mID << std::endl;
}
void operator() (int i) {
std::cout << "Functor print: " << i << std::endl;
data.push_back(i);
std::cout << "Dump: ";
for(int i = 0; i < data.size(); ++i)
std::cout << data[i] << " ";
std::cout << std::endl;
}
};
unsigned Functor::id = 0;
을, 프록시 객체는 단순히 2 일을 그것은 CMD 밖으로 데이터를 출력하고 자체 사용하는 것이 사본을 저장합니다. 다음은 객체의 사용 사례 예제입니다.
int main() {
std::vector<int> intvec;
for(int i = 0; i < 10; ++i)
intvec.push_back(i);
Functor myfunctor;
std::for_each(intvec.begin(), intvec.end(), myfunctor);
std::cout << "Data in my functor: " << myfunctor.data.size() << std::endl;
for(int i = 0; i < myfunctor.data.size(); ++i)
std::cout << "myfunctor data: " << myfunctor.data[i] << std::endl;
return 0;
}
이 부분이 실제로 나를 비웃습니다. 생성 된 출력은 내 functor 프록시 객체가 한 번 생성되지만 세 번 해체됩니다. 뭔가 건설 용 전화를 우회하고 있습니다.
또한 std :: for_each의 끝에서 소멸자가 호출 된 결과 Functor.data도 비어 있습니다!
Functor 내부의 데이터가 지속적으로 유지되도록하는 방법이 있습니까? std :: for_each (기본 펑터를 사용할 수있는 기본적으로 주어진 std 알고리즘 함수)와 같은 함수 내에서 사용할 때 내 펑터의 상태를 추적하고 싶습니다.
참고 : C++ 03을 사용하고 있습니다. 만. 많은 감사합니다.
좋아요 감사 : 세 번 인쇄 : 당신이 로깅 복사 생성자를 추가하는 경우
, 당신은 "0 ID로 건설은 Functor"를 볼 수 있습니다. std :: for_each가 호출 환경의 범위에서 Functor를 사용하는지 확인하는 방법이 있습니까? C++ 11과 비슷한 것이 포인터에 의한 참조 또는 전달을 통해 전달됩니다. @NPE –