2016-07-13 2 views
1

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을 사용하고 있습니다. 만. 많은 감사합니다.

답변

1

[...] 내 functor 프록시 개체는 한 번 생성되지만 세 번 해체됩니다. 뭔가 건설 용 전화를 우회하고 있습니다.

아닙니다. 수업은 이며 기본 설정은입니다. 복사 구성 두 번입니다. 복사본 구성을 로그하지 않으므로 출력에 나타나지 않습니다. 이것은 실제로 많은 설명,

Functor(const Functor& other) : mID(other.mID) { 
    std::cout << "Functor constructed with id: " << mID << std::endl; 
    } 
+0

좋아요 감사 : 세 번 인쇄 : 당신이 로깅 복사 생성자를 추가하는 경우

, 당신은 "0 ID로 건설은 Functor"를 볼 수 있습니다. std :: for_each가 호출 환경의 범위에서 Functor를 사용하는지 확인하는 방법이 있습니까? C++ 11과 비슷한 것이 포인터에 의한 참조 또는 전달을 통해 전달됩니다. @NPE –

관련 문제