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
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.
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
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.
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
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()
{
}
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
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.