c++ für Dummies



  • Leider ist das doch nicht so, wie ich das gerne hätte.

    Nach wie vor hätte ich gerne eine Klasse, die sich selbst zählt und im Idealfall von aussen KEINE Parameter erhält. Null, Zero, niente...



  • #include <iostream>
    using namespace std;
    
    class Klasse{
    public:
      Klasse() { zup(-1); };
      ~Klasse() { zup(1); };
      int zup(int num){
    	static int InstanzZaehler;
    	InstanzZaehler -= num;
    	return InstanzZaehler;
      }
    };
    
    int main() {
    	Klasse *a = new Klasse();
    	cout << a->zup(0) << endl;
    	Klasse *b = new Klasse();
    	cout << a->zup(0) << endl;
    	Klasse *c = new Klasse();
    	cout << a->zup(0) << endl;
    	delete a;
    	cout << a->zup(0) << endl;
    	delete b;
    	cout << a->zup(0) << endl;
    	delete c;
    	cout << a->zup(0) << endl;
    	return 0;
    }
    

    lg lolo



  • nicht das noch jemand auf die idee kommt da zup() mit was anderem als ner 0 aufzurufen 😉

    class Klasse{
    public:
      Klasse() { zup(-1); };
      ~Klasse() { zup(1); };
      int getZup(){
    	  return zup(0);
      }
    private:
      int zup(int num){
    	static int InstanzZaehler;
    	InstanzZaehler -= num;
    	return InstanzZaehler;
      }
    };
    
    int main() {
    	Klasse *a = new Klasse();
    	cout << a->getZup() << endl;
    	Klasse *b = new Klasse();
    	cout << a->getZup() << endl;
    	Klasse *c = new Klasse();
    	cout << a->getZup() << endl;
    	delete a;
    	cout << a->getZup() << endl;
    	delete b;
    	cout << a->getZup() << endl;
    	delete c;
    	cout << a->getZup() << endl;
    	return 0;
    }
    

    lg lolo



  • Theorettich hätte ich das auch so, nur bekomme ich immer die undefinierte Referenz.

    D.h. wenn ich

    static int MyIndex;

    habe und dies der Welt über

    int Index () {

    return MyIndex;

    }

    mitteilen will, kommt ein Kompilierfehler. Linkerror undefined reference

    Die Erhöhung sei hier unbenommen, da es keine ANSI-Regel gibt, die 0-Zähler verbieten würde :-))



  • Der Supercoder schrieb:

    Theorettich hätte ich das auch so, nur bekomme ich immer die undefinierte Referenz.

    D.h. wenn ich

    static int MyIndex;

    habe und dies der Welt über

    int Index () {

    return MyIndex;

    }

    mitteilen will, kommt ein Kompilierfehler. Linkerror undefined reference

    Die Erhöhung sei hier unbenommen, da es keine ANSI-Regel gibt, die 0-Zähler verbieten würde :-))

    du nimmst mir das nicht übel wenn ich das jetzt nicht verstanden hab oder 😃

    lg lolo



  • player4245 schrieb:

    Eine Klasse mit Instanzzähler ist ganz einfach:

    class Klasse
    {
      private:
      static int InstanzZaehler;
      
      public:
      
      Klasse() { ++InstanzZaehler; }
      ~Klasse() { --InstanzZaehler }
    
      int InstanzZahl() { return InstanzZaehler; }
    };
    
    {
        Klasse a;
        Klasse b(a);
    }
    

    Huch, minus eine Instanz. Ganz so einfach ist es scheinbar doch nicht. 😉



  • Klasse b(a);
    

    was hat das für ein effect? kopiert das a in b?



  • noobLolo schrieb:

    Klasse b(a);
    

    was hat das für ein effect? kopiert das a in b?

    Das erzeugt ein neues Objekt b als Kopie von a. b existiert unabhängig von a, ist also keine Referenz oder Zeiger oder sonstwas und somit auch unbedingt Zählungswürdig!



  • noobLolo schrieb:

    Klasse b(a);
    

    was hat das für ein effect? kopiert das a in b?

    Das ruft den Kopierkonstruktor auf, welcher vom Compiler automatisch generiert wird.

    Du musst also noch das hier einfügen:

    Klasse ( const Klasse& r ) { ++InstanzZaehler; }
    

    Damit definierst du den Kopierkonstruktor selbst und kannst also auch die Instanz hoch zählen.



  • noobLolo schrieb:

    Klasse b(a);
    

    was hat das für ein effect? kopiert das a in b?

    Genau. Manchmal sieht man auch diese Schreibweise:

    Klasse b = a;
    

    In diesem Fall sind die beiden äquivalent.



  • cool danke, wieder was dazu gelernt 🙂



  • Nachdem ich mich jetzt darum gekümmert habe, konnte ich die Methode von NoobLolo oder so nachvollziehen. Im Gegensatz zur Methode von Nexus, die ich persönlich, für möglich gehalten hatte und selbst auch getestet hatte, meckert der Kompiler/Linker da nicht.

    Daher Lob, Preis und Anerkennung für NoobLolos (oder so) Lösung.



  • Der Supercoder schrieb:

    Nachdem ich mich jetzt darum gekümmert habe, konnte ich die Methode von NoobLolo oder so nachvollziehen. Im Gegensatz zur Methode von Nexus, die ich persönlich, für möglich gehalten hatte und selbst auch getestet hatte, meckert der Kompiler/Linker da nicht.

    Würdest du bitte genauer sagen auf was du dich beziehst, und was der Compiler für einen Fehler ausgibt (Da der Kopierkonstruktor hier relevant ist...).



  • Wieso sollte eine nicht funktionsfähige* Klasse kopiert werden??

    Da fehlt mir irgendwie der Zusammenhang.

    * Im Sinne des Pflichtenheftes



  • Der Supercoder schrieb:

    Im Gegensatz zur Methode von Nexus, die ich persönlich, für möglich gehalten hatte und selbst auch getestet hatte, meckert der Kompiler/Linker da nicht.

    Was für eine Methode? Kannst du ein wenig konkreter werden?

    Der Supercoder schrieb:

    Wieso sollte eine nicht funktionsfähige* Klasse kopiert werden??

    Wenn du Instanzen einer Klasse nicht kopieren willst, verbiete Kopierkonstruktor und Zuweisungsoperator. Alles andere ist keine vernünftige Option.


Anmelden zum Antworten