static im Konstruktor



  • Hallo,

    ich habe eine Klasse geschrieben, für die ich eine Identifikation brauche. Dies habe ich in Form einer Nummer gelöst. Für die Nummer habe ich im Konstruktor folgende zeilen.

    static unsigned long int __NUMMER=0;
        __NUMMER = __NUMMER + 1;
        nr = __NUMMER;
    

    In der main Funktion habe ich die getestet. Bei der folgenden Schreibweise geht alles gut

    Container eins, zwei;
        zwei = eins;
        cout << "Eins: " <<eins.get_nummer() <<  " Zwei: " << zwei.get_nummer() << endl;
    

    Es folgt die ausgabe:Eins: 1 Zwei: 2
    Bei der folgenden schreibweise geht es nicht gut

    Container eins;
        Container zwei = eins;
        cout << "Eins: " <<eins.get_nummer() <<  " Zwei: " << zwei.get_nummer() << endl;
    

    Es folgt die Ausgabe:Eins: 1 Zwei: 1

    Meine Frage ist: Gibt es eine Möglichkeit, das ich bei der zweiten Variante auch die richtige Nummer zuweisen kann?



  • Du musst den Kopierkonstruktor ebenfalls korrekt implementieren, damit da nicht einfach der andere Wert kopiert wird.

    Was die Benennung (__NUMMER ist schlecht) angeht schau mal hier:
    http://www.c-plusplus.net/forum/259432



  • #include <iostream>
    
    using namespace std;
    
    class Container
    {
    	private:
    		static int count_;
    		int num;
    
    	public:
    		Container()
    		{
    			num = ++count_;
    		}
    
    		Container(const Container& counter)
    		{
    			num = ++count_;
    		}
    
    		Container& operator=(const Container& counter)
    		{
    			++count_;
    
    			return *this;
    		}
    
    		int get_nummer() const { return num; }
    };
    
    int Container::count_ = 0;
    
    int main()
    {
    	Container eins;
        Container zwei = eins;
        cout << "Eins: " <<eins.get_nummer() <<  " Zwei: " << zwei.get_nummer() << endl;
    }
    

    Vielleicht so. Wozu brauchst du das überhaupt?



  • Warum erhöhst du count_ im Zuweisungsoperator?



  • Braunstein schrieb:

    Warum erhöhst du count_ im Zuweisungsoperator?

    Das habe ich mich eben auch gefragt. Fettpet könnte das, auch wenn es eher unwahrscheinlich ist, aber auch so wollen.



  • Mit diesen IDs ist das immer so eine Sache. Ich sehe den einzigen Vorteil darin im Debuggen, ansonsten kann man für eine wirklich einzigartige Objekteigenschaft die Adresse nehmen. Aber Zahlen, die aufsteigend nummeriert sind, sind eben etwas anschaulicher im Debugger. Für die Programmlogik an sich ist die Adresse vielleicht geeigneter.

    Man sollte aber auch die Problematik bedenken. Soll a = a; eine neue ID erzeugen? Und std::swap(a,b) ? Und so weiter...



  • Nexus schrieb:

    Mit diesen IDs ist das immer so eine Sache. Ich sehe den einzigen Vorteil darin im Debuggen, ansonsten kann man für eine wirklich einzigartige Objekteigenschaft die Adresse nehmen.

    Also IDs haben ja nun wirklich mehr Anwendungsfälle als Debuggen. Der naheliegendste Fall ist wohl, wenn du so eine Identität auf der Festplatte speicherst, später wieder lädst und dann vielleicht noch mit einem anderen Programm über ein Netzwerk austauschst. Dann ist die Speicheradresse, wo das Objekt irgendwann mal erzeugt wurde nur noch wenig eindeutig. In so einem Fall reicht für die Erzeugung dieser ID aber natürlich nicht mehr so ein einfacher statischer Zähler. Aber auch der kann in eingen Situationen durchaus einen Sinn machen.



  • Ja, klar sind IDs nicht generell was Schlechtes 😉

    Ich meinte mehr die "strenge" Sichtweise wie hier, wo man im Prinzip auch die Adresse nehmen könnte (zumindest nehme ich das an, da ich das Problem im grossen Rahmen nicht kenne). Ansonsten gibt es ja auch Verweise/Handles/Indizes, was auch in die Richtung ID geht und sicher nicht sinnlos ist.



  • brotbernd schrieb:

    Nexus schrieb:

    Mit diesen IDs ist das immer so eine Sache. Ich sehe den einzigen Vorteil darin im Debuggen, ansonsten kann man für eine wirklich einzigartige Objekteigenschaft die Adresse nehmen.

    Also IDs haben ja nun wirklich mehr Anwendungsfälle als Debuggen. Der naheliegendste Fall ist wohl, wenn du so eine Identität auf der Festplatte speicherst, später wieder lädst und dann vielleicht noch mit einem anderen Programm über ein Netzwerk austauschst. Dann ist die Speicheradresse, wo das Objekt irgendwann mal erzeugt wurde nur noch wenig eindeutig. In so einem Fall reicht für die Erzeugung dieser ID aber natürlich nicht mehr so ein einfacher statischer Zähler. Aber auch der kann in eingen Situationen durchaus einen Sinn machen.

    Für so einen Fall sollte man die ID mMn. beim Serialisieren des Graphen erzeugen, was den statischen Zähler wieder unnötig macht.


Log in to reply