Anfänger: class counter



  • Wer kann mir erklären was macht dieser ctor in Klasse counter? Was bedeutet :x_(x) ??

    [#include <iostream>

    class counter {
    public:
    counter(int x = 0) : x_(x) { }
    int operator()() { return x_++; }

    private:
    int x_;
    };

    int main() {
    counter cnt(5);

    for(int i = 0; i < 10; ++i) {
    std::cout << cnt() << std::endl;
    }
    }]



  • #include <iostream>
    
    class counter {
    public:
      counter(int x = 0) : x_(x) { } //konstruktor mit initialisierungsliste und standardwert. 
    
    // eine initialisierungsliste hängt man mit einfachem doppelpunkt an
    // x_ (x) ist eine zuweisung, sprich der in x übergebene wert wird der membervariable x_ zugewiesen
    // initialisierunglisten nutzt man zum intialisieren von membervariablen
    
      int operator()() { return x_++; }
    
    private:
      int x_;
    };
    
    int main() {
      counter cnt(5);
    
      for(int i = 0; i < 10; ++i) {
        std::cout << cnt() << std::endl;
      }
    }
    


  • Danke für die schnelle Hilfe! Ich habe noch viel zu lernen....So ein Forum ist eine ganz gute Idee...

    HAst du ein Beispiel, wo überladen von Operator () sinvoller wäre, als in Klasse counter?



  • Ja, in Funktoren (das sind Objekte, die sich wie Funktionen verhalten, aber einen eigenen Status mitschleifen können).



  • Die Klasse counter ist ein Funktor. Carmen möchte aber wissen, wofür Funktoren gut sind.

    Funktoren werden oft in der STL verwendet. Ich habe hier gerade ein Beispiel, wo ich aus einer std::list einige Elemente nach bestimmten Kriterien entfernen möchte. Dazu schreibe ich mir einen Funktor mit Rückgabewert bool und einem Parameter und verwende übergebe diesen an std::list::remove_if. Etwa so:

    class MyFilter : public std::unary_function<const myObject&, bool>
    {
        // irgendwelche Zustandsvariablen
    
      public:
        void setKriteriumXyz(int);
        bool operator() (const myObject& o) const;
    };
    
    typedef std::list<MyObject> MyObjectList;
    MyObjectList meineListe;
    
    ...
    
    MyFilter filter;
    filter.setKriteriumXyz(345);  // übergebe Kriterium an den Filter
    meineListe.remove_if(filter);
    


  • Hmmm, also ich persönlich finde operator()() in counter eigentlich nicht so gut.

    Ein Funktor ist eine Klasse, deren Objekte sich wie Funktionen einsetzen lassen. Im Beispiel von tntnet sieht man eine Anwendung, bei der das nützlich ist: remove_if() kann man genauso gut mit einer geeigneten Funktion, wie mit einem Objekt einsetzen. Das macht remove_if() flexibler.

    Im Falle von counter sehe ich diese Anwendung nicht, also fände ich eine ganz normale Funktion value() (oder so) besser, weil ausdrucksstärker.

    Bloß eine Meinung....

    Stefan.


Anmelden zum Antworten