class Vererbungen kürzbar?

Serenifly:
Im Deutschen heißen die auch Klassenvariablen (alle Objekte der Klasse teilen sich eine Variable). Im Gegensatz zu Instanzvariablen (jede Instanz hat ihre eigene Version)

Oh !!
Lass das nicht den Whandall hören... :o :o :o
Die Kröte möchte bei ihm auch nicht runter
:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

Ich habe mit Klassenvariable unrichtigerweise eine Instanzvariable benannt,
wird sicher nicht wieder vorkommen.

Was ich damit meinte kann man ja meinem Kodevorschlag entnehmen,
da darf sich dann jeder aussuchen wie er was nennt.

Hallo,

ich kann das gedanklich irgendwie noch nicht trennen. Wenn die Methode zu irgendeinem konkreten Objekt gehört, dann sollten doch auch die Variablen in der Methode zum konkreten Objekt gehören. Ich nehme das erstmal so hin und merke mir das erstmal so wie ihr das sagt. Es wäre vielleicht wichtig wenn das jemand im OOP Thread nochmal deutlich erwähnen würde.

Vielleicht nochmal anders herum. Wofür möchte/könnte man eine Variable haben die von allen Objekten verändert werden kann? Damit wäre doch die Kapselung verloren. Vielleicht würde so ein Bsp. weiterhelfen.

Habe die abs_old Variable zur Klassenvariablen gemacht ohne static und es funktioniert. Jetzt schau ich mir Whandalls Code an was er für Änderungen drin hat.

Ich korrigiere nachdem Update im Thread hier. :wink:
Habe die abs_old Variable zur Instanzvariablen gemacht ohne static und es funktioniert.

Wenn ich auf Arbeit Anlagen repariere und tausche eine Schraube aus, dann gehört diese zu einer Baugruppe (Methode) und die Baugruppe zur Anlage (Klasse). Die gleiche Anlage daneben kann sich an der Schraube gegenüber nicht selbst bedienen oder verändern.

Der Vergleich hinkt, weil sich nicht 2 Anlagen eine Schraube teilen können.
Du arbeitest in der Anlage, mit vielen Instanzen, der Vorlage Schraube.
Die Schrauben haben keinen Grund miteinander, über eine gemeinsame Variable, zu kommunizieren.

Wie gesagt, du verwechselst Baumuster/Vorlage, mit Instanz.

Vielleicht nochmal anders herum. Wofür möchte/könnte man eine Variable haben die von allen Objekten verändert werden kann?
Damit wäre doch die Kapselung verloren. Vielleicht würde so ein Bsp. weiterhelfen.

Ich habe im OOP Thread ein Singleton Muster implementiert.
Und Whandall eine Liste.
Beide verwenden dieses.

Bei dem Singleton unterläuft es die Kapselung ausdrücklich/explizit, indem die Client Klasse die Singleton Mutter als friend definiert.

Und du könntest den Grad der Kapselung mit private, protected und public bestimmen/festlegen.

Doc_Arduino:
Wenn die Methode zu irgendeinem konkreten Objekt gehört, dann sollten doch auch die Variablen in der Methode zum konkreten Objekt gehören.

Könnte man denken, ja. Ist aber nicht so

Wofür möchte/könnte man eine Variable haben die von allen Objekten verändert werden kann?

Es gibt Anwendungen bei denen man zählen möchte wie viele Objekte erzeugt wurden

Wenn die Methode zu irgendeinem konkreten Objekt gehört, dann sollten doch auch die Variablen in der Methode zum konkreten Objekt gehören.

Ziehe es mal andersrum auf:

Die lokale Variable gehört grundsätzlich der Methode.
Sie ist nur in dieser Sichtbar, Erreichbar, Gültig.

Die Methode gehört einem Objekt/Klasse

combie:
Stimmt ja auch...

Nein stimmt nicht.

Funktionslokale Variablen gehören nur zur Funktion, zu keinem Objekt.

Hallo,

ich muss das viele Gesagte erstmal so hinnehmen. Vielleicht legen sich meine inneren Widersprüche irgendwann von selbst. Hauptsache ich weiß was los ist und kann euch verstehen was ihr mir sagen möchtet und anwenden. Darauf kommt es erstmal an. Deshalb sage ich erstmal Danke an alle und schau erstmal was ich alles umbauen kann bzw. von Whandall übernehme.
Ansonsten melde ich mich nochmal. Logisch. :slight_smile:

combie:
Ziehe es mal andersrum auf:

Die lokale Variable gehört grundsätzlich der Methode.
Sie ist nur in dieser Sichtbar, Erreichbar, Gültig.

Die Methode gehört einem Objekt/Klasse

Nach dieser deiner Korrektur bin ich nun völlig verwirrt. Dann müßte es nach meiner Logik ja funktionieren. Die gekapselte Gültigkeit ist jedoch nicht gegeben, dass sagen eure bisherigen Antworten und das der Sketch nicht funktioniert, weil alle Zähler machen was sie wollen nur nicht das was sie sollen. Ich glaube wenn wir #25, #26 und diesen hier einfach löschen, dann bleibt das bisher erklärte von Euch nachvollziehbar erhalten. Ich glaube manche Dinge kann man nicht noch besser erklären. Ich muss es nur verstehen lernen. Ich bin da auf einem ganz guten Weg denke ich.

Ich muss mir "nur erstmal" merken das lokale Variablen in einer Methode von allen Objekten/Instanzen verwendet werden. Deshalb müssen alle Variablen zur Klasse gehören - also vorher bekannt sein. Außer man hat gute Gründe das nicht zu tun wie euer singleton Muster.

Ich muss mir "nur erstmal" merken das lokale Variablen in einer Methode von allen Objekten/Instanzen verwendet werden.

Nein. Das ist nicht der Fall. Es geht um nur um "static". Static hat in OOP eine andere Bedeutung als ursprünglich in C.

Eine lokale nicht-statische Variable ist nicht in allen Objekten gleich und verhält sich wie du erwartest. Aber eine lokale statische Variable in einer Methode ist etwas anderes als in einer Funktion

Aber eine lokale statische Variable in einer Methode ist etwas anderes als in einer Funktion

Wieso?
Es verhält sich identisch.
Vollkommen.

Nur eben, dass die Funktion "frei" in der Luft schwebt, und die Methode nur im Kontext der Klasse/Instanz aufgerufen werden kann.

Was irrt mich da?

Serenifly:
Aber eine lokale statische Variable in einer Methode ist etwas anderes als in einer Funktion

Nein, eine statische lokale Variable in einer Methode verhält sich genauso wie in einer normalen Funktion.

combie:
, und die Methode nur im Kontext der Klasse/Instanz aufgerufen werden kann.

Wenn es denn keine statische Member Funktion ist, die kann auch ohne Instanz aufgerufen werden.

Das ist doch alles nur kleinliche Haarspalterei

Es geht darum das Doc_Arduino wohl dachte dass statische Variablen in einer Methode nur von Aufruf zu Aufruf der Methode ihren Wert behalten (wie in einer Funktion). Aber dazu kommt eben dass sie dann plötzlich für alle Objekte der Klasse gleich ist. Auch wenn sie gar nicht global ist

Aus dem Blickwinkel kann man das eben nicht direkt von Funktionen auf Methoden übertragen. Nicht ohne die zusätzlichen Bedeutungen von static bei OOP zu kennen

class Test
{
public:
  void increment()
  {
    static int var = 0;
    var++;
    Serial.println(var);
  }
};


void setup()
{
  Serial.begin(9600);

  Test test1;
  Test test2;
  Test test3;

  test1.increment();
  test2.increment();
  test3.increment();
}

void loop()
{
}

Hallo,

kann irgendwie nicht stimmen. Nehme ich static (vor abs_old) im Eingangscode in beiden update_relCounter() Methoden in den Vererbungen raus, dann machen alle Zähler wilde Sachen. Mache ich abs_old zur non static Klassenvariablen funktioniert alles.

meine aktuelle Zusammenfassung

  • mit static lokaler Variable in der update_relCounter() Methode funktioniert es eher zufällig richtig
  • ohne static in der update_relCounter() Methode funktionieren die Zähler nicht
  • abs_old als non static Klassenvariable funktioniert

Hallo,

der kleine Testsketch verhält sich du sagst. Meine Zähler allerdings nicht.

Doc_Arduino:

  • abs_old als non static Klassenvariable funktioniert

Logisch, das ist ja auch der einzige Fall bei dem jeder Counter ein eigenes abs_old hat.

Nehme ich static (vor abs_old) im Eingangscode in beiden update_relCounter() Methoden in den Vererbungen raus, dann machen alle Zähler wilde Sachen.

Dann ist es eine ganz normale lokale Variable die am Ende der Methode aufhört zu existieren. Und auch daran denken dass nicht-statische lokale Variable nicht initialisiert werden

Whandall:
Wenn es denn keine statische Member Funktion ist, die kann auch ohne Instanz aufgerufen werden.

Sach ich ja....

entweder im Instanz Kontext:

test.tuwas()
test->tuwas()

oder im Klassenkontext:

Test::tuwas()

Abhängig davon, wie die Methode definiert ist.

Nicht ohne die zusätzlichen Bedeutungen von static bei OOP zu kennen

Nichts dagegen die Bedeutung von static im Klassen Kontext zu kennen.
Aber in Funktionen und Methoden hat das static (bei lokalen Variablen) die gleiche Bedeutung.

  • ohne static in der update_relCounter() Methode funktionieren die Zähler nicht

Weil sie bei jedem Aufruf mit Null, oder Schrott, vorbesetzt werden

  • abs_old als non static Klassenvariable funktioniert

Du meinst als Instanzvariable.
Ja, dafür wurde das Konzept erfunden.

combie:
Aber in Funktionen und Methoden hat das static (bei lokalen Variablen) die gleiche Bedeutung.

Genau.

class Test {
  public:
    void increment() {
      static int var = 0;
      var++;
      Serial.print(F("method   "));
      Serial.println(var);
    }
} test1, test2, test3;;

void funct_increment() {
  static int var = 0;
  var++;
  Serial.print(F("function "));
  Serial.println(var);
}

void setup() {
  Serial.begin(250000);

  test1.increment();
  funct_increment();
  test2.increment();
  funct_increment();
  test3.increment();
  funct_increment();
}

void loop() {}
method   1
function 1
method   2
function 2
method   3
function 3