2016-07-13 13 views
1

Ich habe das folgende Problem mit std :: for_each und einem Funktor Proxy-Objekt. Siehe den folgenden Code:std :: for_each und std :: Vektor Destruktor Aufruf

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; 

Von oben hat das Proxy-Objekt einfach zwei Dinge, druckt er die Daten an den CMD und speichert eine Kopie für sich selbst zu verwenden. Unten ist der Beispiel-Anwendungsfall des Objekts:

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; 
} 

Dies ist der Teil wird es wirklich fischig für mich. Die erzeugte Ausgabe ist, dass mein Funktor-Proxy-Objekt einmal konstruiert, aber dreimal dekonstruiert wird! Etwas umgeht den Bauaufruf.

Auch durch den Aufruf des Destruktors am Ende von std :: for_each ist das Functor.data ebenfalls leer!

Gibt es eine Möglichkeit, sicherzustellen, dass Daten in Functor persistent bleiben? Ich möchte den Zustand meines Funktors verfolgen, wenn er innerhalb von Funktionen wie std :: for_each verwendet wird. Grundsätzlich

Bitte beachten Sie, dass ich C++ 03 verwende NUR. Danke vielmals.

Antwort

1

[...] mein Funktor-Proxy-Objekt ist einmal konstruiert, aber dreimal dekonstruiert! Etwas umgeht den Bauaufruf.

Nicht ganz. Ihre Klasse ist default-constructed einmal, aber ist auch Kopie-konstruierte zweimal. Sie protokollieren den Kopieraufbau nicht, sodass er nicht in der Ausgabe angezeigt wird.

Wenn Sie eine Protokollierungs Copykonstruktor hinzufügen, werden Sie „Functor mit id aufgebaut: 0“ sehen gedruckt dreimal:

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

Okay, danke, das erklärt eigentlich viel. Gibt es eine Möglichkeit für mich, sicherzustellen, dass std :: for_each den Functor im Bereich der aufrufenden Umgebung verwendet? Etwas Ähnliches wie C++ 11 wird als Referenz übergeben oder als Zeiger übergeben. @ NPE –

Verwandte Themen