Forum: Mikrocontroller und Digitale Elektronik Arduino Framework Klassen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von kenny (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin kein Experte was die Programmierung angeht, aber bei weitem auch 
nicht ahnungslos (Assembler, C, C++, Basic, ..).
Beim betrachten einer Arduino Lib für einen SPI Port Expander (MCP23008) 
kamen mir ein paar Fragen bezüglich der Klassen.

Ich habe mal fein gelernt das man Variablen in einer private Klasse 
durch Setter (setzten) und Getter (lesen) Funktionen schützt (vor 
un-plausiblen Eingaben).

Ist das unsauber programmiert, oder macht man das heutzutage so?

Weiter ist mir aufgefallen das es keinen Destruktor gibt.

Ist das beim Arduino Framework nicht nötig, oder wurde auch hier 
unsauber gearbeitet.

von Totomitharry (Gast)


Lesenswert?

Hätte jetzt mal ohne Ahnung aber mit Programmierkenntnissen gesagt, das 
ist bei uC in der Größenordnung egal.

Da kommt ja niemand Public an und will jetzt einen Zugriff auf eine 
Private Variable haben sondern der Programmierer bestimmt es selbst was 
worauf zugreift.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

kenny schrieb:
> Ich habe mal fein gelernt das man Variablen in einer private Klasse
> durch Setter (setzten) und Getter (lesen) Funktionen schützt (vor
> un-plausiblen Eingaben).

Die private Variable ist doch geschützt, denn sie ist privat. Es gibt 
keine Setter weil man von außen überhaupt nicht drauf zugreifen soll. 
Interne (private) Setter sind eher unüblich.

kenny schrieb:
> Ist das beim Arduino Framework nicht nötig

Doch, aber was sollte in den Destruktor dieser Klasse hinein? Wenn eine 
Klasse nichts aufzuräumen hat, braucht's auch keinen expliziten 
Destruktor. In C++ bekommen Klassen automatisch einen impliziten 
Destruktor, welcher einfach nur die Destruktoren der Member-Variablen 
aufruft. Da "uint8_t" keinen Destruktor hat, passiert hier also gar 
nichts. Außerdem werden von dieser Klasse wahrscheinlich nur globale 
Instanzen angelegt, deren Destruktoren ohnehin niemals aufgerufen 
werden, weil Mikrocontroller-Programme sich (normalerweise) nie beenden!

Es gibt aber ein ganz anderes Problem: Die Datei definiert ein Makro 
namens "_ADAFRUIT_MCP23008_H". Bezeichner, die mit 
Unterstrich+Großbuchstabe oder 2 Unterstrichen beginnen, sind aber der 
Umgebung, d.h. Compiler+C++ Standard Bibliothek, vorenthalten. Auch wenn 
dies in diesem Fall wahrscheinlich keine Probleme verursacht, ist es 
trotzdem inkorrektes C++. Außerdem ist es nicht sehr schön, die 
Bitmasken für die Register mit Makros ("#define") zu definieren. In C++ 
ist es möglich und sauberer, Konstanten (mit "const") zu verwenden.

Totomitharry schrieb:
> Da kommt ja niemand Public an und will jetzt einen Zugriff auf eine
> Private Variable haben sondern der Programmierer bestimmt es selbst was
> worauf zugreift.

Exakt genau so ist es beim PC aber auch. "private" schützt auch da nicht 
zur Laufzeit, sondern immer nur vor versehentlichen Fehlern...

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

kenny schrieb:
> Ich habe mal fein gelernt das man Variablen in einer private Klasse
> durch Setter (setzten) und Getter (lesen) Funktionen schützt (vor
> un-plausiblen Eingaben).

Was ist eine private Klasse?

Die Regel sagt eher: Keine public Eigenschaften/Variablen

kenny schrieb:
> Weiter ist mir aufgefallen das es keinen Destruktor gibt.
Ein Destruktor ist nur nötig wenn wenn auch was dekonstruiert werden 
soll/muss.
z.B. reservierter Speicher freigeben.
So reicht auch der default Destruktor.

Niklas G. schrieb:
> Es gibt aber ein ganz anderes Problem: Die Datei definiert ein Makro
> namens "_ADAFRUIT_MCP23008_H". Bezeichner, die mit
> Unterstrich+Großbuchstabe oder 2 Unterstrichen beginnen, sind aber der
> Umgebung, d.h. Compiler+C++ Standard Bibliothek, vorenthalten.

Ganz abgesehen von dem Fehler:
Den alten IncludeGuard könnte man sowieso durch #pragma once ersetzen.

von Wilhelm M. (wimalopaan)


Lesenswert?

kenny schrieb:
> Ich habe mal fein gelernt das man Variablen in einer private Klasse
> durch Setter (setzten) und Getter (lesen) Funktionen schützt (vor
> un-plausiblen Eingaben).

Da keine der Elementfunktion const ist, sind das alles Modifikatoren aka 
setter. DAS halte ich für unsauber.

kenny schrieb:
> Weiter ist mir aufgefallen das es keinen Destruktor gibt.

Doch, es gibt den default-dtor. Warum sollte der nicht ok sein?

von Stefan F. (Gast)


Lesenswert?

kenny schrieb:
> Ich habe mal fein gelernt das man Variablen in einer private Klasse
> durch Setter (setzten) und Getter (lesen) Funktionen schützt (vor
> un-plausiblen Eingaben).

Das wurde gerade in einem anderen Thread kontrovers diskutiert. Es kommt 
auf den persönlichen Geschmack an.

> Weiter ist mir aufgefallen das es keinen Destruktor gibt.

Dito.

von Wilhelm M. (wimalopaan)


Lesenswert?

Arduino Fanboy D. schrieb:
> Was ist eine private Klasse?

Mit "privater Klasse" könnte eine private Deklaration einer 
geschachtelten Klasse gemeinst sein. Bin aber ziemlich sicher, dass der 
TO das nicht meint, sondern einfach nur von non-static Datenelementen 
spricht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.