Statische Klassenelemente



  • Hi !!!

    Ich habe den Sinn von static Variablen in Klassen noch nicht so ganz verstanden.
    In einem Buch steht folgendes:

    "Die Elemente eines Objektes haben eine Eigenschaft, die nicht immer wünschenswert sein muß: sie sind objektspezifisch, d.h. sie gelten für jedes Objekt einer Klasse einzeln und nie für alle zusammen. Es kann aber sinnvoll sein, klassenspezifische Elemente zu haben"

    Diesen Satz verstehe ich nicht. Vielleicht kann mir jemand dabei behilflich sein, die statischen Klassenelemente und deren Sinn zu verstehen.

    Elemente eines Objektes sind doch beispielsweise bei int die einzelnen Zahlen.
    D.h. wenn ich
    int n = 5;
    habe, dann ist das Objekt doch das "n" und das Element ist die "5". Oder verstehe ich das falsch?
    Aber das ist doch normal, dass die 5 nur für das n gilt, und wo kann es nicht wünschenswert sein? Wie kann es sinnvoll sein klassenspezifische Elemente zu haben? In welchen Fällen?

    Im speziellen geht es bei mir um folgendes:
    Ich baue mir eine Basisklasse Matrix, die wie folgt definiert ist:

    class Matrix{
    private:
      // Matrix Dimension
      unsigned int m;
      unsigned int n;
      // Anzahl der Elemente ungleich 0
      unsigned int z;
    public:
      Matrix(unsigned int M = 0, unsigned int N = 0, unsigned int Z = 0)
      {
        m = M;
        n = N;
        z = Z;
      }
    ...
    }
    

    Die Elemente ungleich 0 werden nach und nach in die Matrix eingegeben.

    Es gibt auch noch zwei abgeleitete Klassen, die ähnlich definiert sind.

    Lohnt sich hier die Deklaration der Variablen z als static?

    Doch ich würde mir die Frage lieber selber beantworten können, wenn ich static in Klassen verstanden habe 😉



  • Nein, das würde nicht funktionieren, denn das hieße, daß alle
    Matritzen denselben Wert für z haben. Static-member gibt es nur
    einmal für alle Instanzen der Klasse.

    Ein einfaches Beispiel um static zu verstehen:

    class Matrix{ 
    private: 
      // Matrix Dimension 
      unsigned int m; 
      unsigned int n; 
      unsigned int z; 
    public: 
      static int insgesamtErzeugteMatrizen = 0;
    
      Matrix(unsigned int M = 0, unsigned int N = 0, unsigned int Z = 0) 
      { 
        m = M; 
        n = N; 
        z = Z; 
        insgesamtErzeugteMatrizen++;
      } 
    ... 
    }
    

    Die Variable insgesamtErzeugteMatrizen gibt es nur einmal in der
    Klasse Matrix (und damit auch in deren abgeleiteten) und zählt mit,
    wieviele Objekte du während des Programmlaufs insgesamt erzeugt hast.



  • Du hast den Satz falsch verstanden 😉

    Wenn Du int n = 5 machst ist 5 auf das n bezogen, logisch, würde wohl auch niemand in einem Buch erwähnen.

    Wenn Du aber eine Klasse Matrix hast, die ein int n enthält, so ist dieses n spezifisch für jedes Objekt vom Typ Matrix. D.h. wenn Du zwei Instanzen, mat1 und mat2 hast, hat jede Instanz ihren eigenen Wert für n.

    Wenn n static wäre, hätten nicht mat1 und mat2 je ein n, sondern die ganze Klasse Matrix hätte nur ein n. Du brauchst kein Objekt, um Matrix::n anzusprechen und wenn, bekommst Du für jedes Objekt dasselbe n (nämlich das der Klasse).

    Und jetzt beantworte Deine Frage selbst 😃



  • Ah, alles klar 🙂

    Wieder mal vielen Dank für die sehr schnelle Beantwortung der Frage. 👍


Anmelden zum Antworten