Forum: Mikrocontroller und Digitale Elektronik Frage zu Klassen


von Markus O. (markusjo)


Lesenswert?

Hi,

ich steige gerade in das Thema Klassen ein. Leider liegt mir das derzeit 
gar nicht, will es aber versuchen. Hab mir dazu einige Seiten und Videos 
angesehen. Auf der folgenden Seite finde ich das ganz gut erklärt: 
https://spacehal.github.io/docs/arduino/objectOriented
1
  public:                 // alle Methoden (oder Attribute) nach public sind öffentlich
2
    Led(int pPin) {       // Konstruktor (ohne void, int, etc.)
3
      pinLed   = pPin;
4
      stateLed = false;
5
      pinMode(pinLed, OUTPUT)

Wieso wird "pinLed nicht direkt in den Konstruktor geschrieben, sondern 
"pPin" und dann direkt an die pinLed var. übergeben? MUSS das so oder 
kann man das so machen? Welche Vorteile gibt es, wenn es nicht notwendig 
ist?

Vielen Dank!

: Gesperrt durch Moderator
von Stefan F. (Gast)


Lesenswert?

Markus O. schrieb:
> Wieso wird "pinLed nicht direkt in den Konstruktor geschrieben

Meinst du so?:
1
public:
2
   Led(int pPin) : pinLed(pPin) {  
3
      stateLed = false;
4
      pinMode(pinLed, OUTPUT)

Für mich sind das einfach nur zwei Alternativen, die letztendlich das 
Gleiche bewirken.

pPin ist jedenfalls ein Argument des Konstruktors und nur innerhalb des 
Konstruktors bekannt.

So geht es nicht:
1
public:
2
   Led(int pinLed) {  
3
      stateLed = false;
4
      pinMode(pinLed, OUTPUT)

Weil damit die gleichnamige Member Variable pinLed nicht initialisiert 
würde. Argumente und Member Variablen sind nicht das gleiche.

Beitrag #7458273 wurde vom Autor gelöscht.
Beitrag #7458275 wurde von einem Moderator gelöscht.
von Markus O. (markusjo)


Lesenswert?

Stefan F. schrieb:
> public:
>    Led(int pinLed) {
>       stateLed = false;
>       pinMode(pinLed, OUTPUT)

Ja, genau so meinte ich das.

> So geht es nicht:

Ok! Werde es mir mit einem freien Kopf und viel Ruhe noch einmal genau 
ansehen.

Danke!

von Oliver S. (oliverso)


Lesenswert?

pinLed sollte eigentlich nach der Initialiserung durch den Konstruktor 
nicht mehr verändert werden können, weil im laufende Betrieb niemand die 
LEDs umlötet.

Also kann das const sein, was dann die erste Art der Initialisierung im 
Konstruktor-Rumpf nicht mehr erlaubt.

Der initiale Wert für stateLed  lässt sich dann auch gleich bei der 
Deklaration angeben, und wenn man dann noch das undefinierte pin in 
pinLED ändert, sieht es so aus:
1
class Led { 
2
    const int  pinLed;  
3
    bool stateLed {false};  
4
5
  public:                   
6
    Led(int pPin) : pinLed(pPin) {  
7
      pinMode(pinLed, OUTPUT); // Pin als Ausgang definieren
8
    }
9
};

Oliver

von Stefan F. (Gast)


Lesenswert?

Es könnte z.B. auch sein, dass du den Integer Wert begrenzen willst.
1
public: 
2
   Led(int pPin) { 
3
      if (pinLed >= 0) {
4
         pinLed   = pPin;
5
         pinMode(pinLed, OUTPUT)
6
      } else {
7
         pinLed = -1; // -1 bedeutet "nicht verwendet"
8
      }
9
      stateLed = false;

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Markus O. schrieb:
> pinMode(pinLed, OUTPUT)

Da fehlt ein Semikolon!
Zudem hat pinMode() nichts im Konstruktor zu suchen.
Bei AVR vielleicht unkritisch.
Aber bei anderen Architekturen ist noch nicht gewährleistet, dass zu dem 
Zeitpunkt der pinMode() seine Wirkung entfalten kann.

Darum haben auch alle Klassen in der Arduino Welt (die sowas tun müssen) 
eine begin() oder init() Methode.

von Stefan F. (Gast)


Lesenswert?

Arduino F. schrieb:
> Da fehlt ein Semikolon!

Super, damit wurde die Welt mal wieder vor dem Verderben gerettet.

von Michael B. (laberkopp)


Lesenswert?

Markus O. schrieb:
> Wieso wird "pinLed nicht direkt in den Konstruktor geschrieben

?!?

Markus O. schrieb:
> MUSS das so oder kann man das so machen

Man kann auch mit einer constructor member initializer list arbeiten, 
aber der Computer hat letztlich immer genau dasselbe zu tun: den als 
Parameter übergebenen Wert in die Klassenstruktur zu kopieren.

Hier verschiedene Möglichkeiten:

https://www.learncpp.com/cpp-tutorial/constructor-member-initializer-lists/

Markus O. schrieb:
> Leider liegt mir das Thema derzeit gar nicht,

Dabei ist es so einfach:

So bald man Exceptions in einer Programmiersprache ermöglichen will
1
void processing(char *ptr)
2
{
3
   // tue irgendwas 
4
}
5
void shit(int x)
6
{
7
  if(x>20) throw "Bullshit";
8
}
9
void test(int y)
10
{
11
   try
12
   {
13
      char *leaked=strdup("Something");
14
      shit(y);
15
      processing(leaked);
16
      free(leaked);
17
   }
18
   catch (char *message)
19
   {
20
       puts(message);
21
   }
22
}
23
int main(void)
24
{
25
   test(22);
26
}
hat man ein Problem mit dynamisch allokiertem Speicher auf dem heap, 
hier leaked welcher bei einem Fehler in shit nicht mehr freigegeben 
wird.

Man braucht Variablen die bei einem stack unwind, also Verlassen des 
Scopes, ihre Daten selbst freigegeben können. Man braucht also Variablen 
mit Codeergänzung, vor allem Destruktoren.

Eine Klasse ist eine struct Struktur mit Funktionen die einen 
versteckten self Patameter auf ein Element diesen Strukturtyps 
beinhalten.
1
struct string
2
{
3
   char *data;
4
}
5
assign(struct string *self,char *value)
6
{
7
   self->data=strdup(value);
8
}
9
destroy(struct string *self)
10
{
11
   free(self->data);
12
}
ist dann
1
class string
2
{
3
   char *data;
4
   string(char *value)
5
   {
6
      data=strdup(value);
7
   }
8
   ~string()
9
   {
10
      free(data);
11
   }
12
}
mit dem Zusatzeffekt, dass ~string automatisch aufgerufen wird, wenn so 
eine Variable im stack unwind freigegeben wird, also
1
void processing(char *ptr)
2
{
3
   // tue irgendwas 
4
}
5
void shit(int x)
6
{
7
  if(x>20) throw "Bullshit";
8
}
9
void test(int y)
10
{
11
   try
12
   {
13
      string notleaked("Something");
14
      shit(y);
15
      processing(notleaked);
16
   } // bei verlassen dieses Blocks egal ob normal oder wegen exception wird ~string von notleaked automatisch aufgerufen und gibt den Speicher auf den data zeigt frei
17
   catch (char *message)
18
   {
19
       puts(message);
20
   }
21
}
22
int main(void)
23
{
24
   test(22);
25
}
Alles andere (Vererbung etc.) ist dann nur Zusatznutzen oder -ärger.

Der Kern sind aber Klassen = eine struct aus Daten zusätzlich mit 
Funktionen mit verstecktem self Parameter die dann eben nicht Funktionen 
sondern Methoden heissen.

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Stefan F. schrieb:
> damit wurde die Welt mal wieder vor dem Verderben gerettet.

Ja!
Jeder Fehler weniger bringt einen der Lösung näher!
Das hast du gut erkannt.
1
class Led                 // Beginn der Klassendefinition
2
{
3
  private:
4
    const byte pinLed;          // LED-Pin (Attritbute der Klasse)
5
    bool stateLed;        // Zustand der LED
6
7
  public:                 // alle Methoden (oder Attribute) nach public sind öffentlich
8
    Led(const byte pPin):pinLed{pPin},stateLed{false}{}  
9
    void init()     
10
    {
11
      pinMode(pinLed, OUTPUT);
12
    }
13
    void toggle()         // Die Methoden einer Klassen können auf die Attribute zugreifen
14
    {
15
      stateLed = !stateLed;
16
      digitalWrite(pinLed, stateLed);
17
    }
18
};                        // Eine Klassendefinition endet mit einem Semikolon
19
20
Led ledGreen(4);  // ein `Led` Objekt mit dem Namen `ledGreen` mit Pin 4
21
Led ledRed(5);      // ein weiteres `Led` Objekt mit Pin 5
22
23
void setup()
24
{
25
  ledGreen.init();
26
  ledRed.init();
27
}
28
29
void loop()
30
{
31
  ledGreen.toggle();      // Methodenaufruf vom Objekt ledGreen
32
  delay(200);
33
  ledRed.toggle();        // Methodenaufruf vom Objekt ledGreen
34
  delay(800);
35
  ledGreen.toggle();
36
  delay(200);
37
  ledRed.toggle();
38
  delay(800);
39
}

Warum der Autor des Tutorials es anders macht?
KA... Ihm ist aber nicht der Einzige...

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Arduino F. schrieb:

> Jeder Fehler weniger bringt einen der Lösung näher!

Dann würde ich noch auf die gute, alte Regel aufmerksam machen wollen, 
nach der jeder c'tor der nur ein nicht default Argument hat und nicht 
zur impliziten Konvertierung dienen soll, als `explicit` markiert werden 
sollte:
1
    explicit Led(const byte pPin)...

Ansonsten könnte der Compiler den c'tor verwenden, um implizite 
Konvertierungen vor zu nehmen. Dieses Beispiel würde übersetzen obwohl 
man ggf. lieber einen Fehler vom Compiler hätte:
1
void light_show(Led light);
2
3
int main()
4
{
5
    light_show( 42 );
6
}

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Torsten R. schrieb:
> Dieses Beispiel würde übersetzen obwohl
Das Drama ist eigentlich, dass die begin() Methode in dem Fall nicht 
ausgeführt wird.


Macht es nicht Sinn dort eine Referenz zu übergeben?
> void light_show(Led &light)
Dann bekommst du auch deine Meldung.


Und ja, explicit ist hier durchaus Sinn behaftet!
Wieder eine/zwei potentielle Fehlerquellen ausgemerzt.
Die Welt wird so gerettet (ein Stückchen besser), quasi zum Nulltarif

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Michael B. schrieb:
> Man kann auch mit einer constructor member initializer list arbeiten,
> aber der Computer hat letztlich immer genau dasselbe zu tun: den als
> Parameter übergebenen Wert in die Klassenstruktur zu kopieren.

Das kommt darauf an, was man will. Aber im Normalfall muss man das in 
der initializer-list des ctors machen.

Arduino F. schrieb:
> class Led                 // Beginn der Klassendefinition
> {
>   private:
>     const byte pinLed;          // LED-Pin (Attritbute der Klasse)
>     bool stateLed;        // Z

Es gibt den Spruch "naming is hard", und das trifft hier genau zu - 
wobei es hier eigentlich ganz leicht ist, die Namensgebung zu 
verbessern.

von Wilhelm M. (wimalopaan)


Lesenswert?

Michael B. schrieb:
> char *leaked=strdup("Something");

Was hat das hier im Kontext von C++ zu suchen?
Es dient nur dazu, damit Du Dein Wissen über exceptions hier einbringen 
kannst.

von Wilhelm M. (wimalopaan)


Lesenswert?

Torsten R. schrieb:
> Dieses Beispiel würde übersetzen obwohl
> man ggf. lieber einen Fehler vom Compiler hätte:

In dem Beispiel gibt es zwei Gründe dafür, und explicit ist nur einer 
dafür ;-)

Beitrag #7459074 wurde von einem Moderator gelöscht.
Beitrag #7459075 wurde von einem Moderator gelöscht.
Beitrag #7459076 wurde von einem Moderator gelöscht.
Beitrag #7459077 wurde von einem Moderator gelöscht.
von Wilhelm M. (wimalopaan)


Lesenswert?

Yeah, Moby ist da ;-)

Beitrag #7459080 wurde von einem Moderator gelöscht.
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Wilhelm M. schrieb:
> Moby ist da ;-)

Und gleich wird er uns seine portable ASM Lösung vorstellen, die auf 
jedem µC/Arduino läuft.

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Arduino F. schrieb:
> Und gleich wird er uns seine portable ASM Lösung vorstellen

Moby hat hier noch nie jemandem geholfen. Nur geprahlt. Dabei gibt (und 
gab) es genügend Fragen/Probleme in diesem Forum zu Assembler, die bis 
heute ungelöst sind. Nein: Keines davon hat Moby jemals beantwortet oder 
gelöst. Typischer Blender halt.

: Bearbeitet durch Moderator
Beitrag #7459102 wurde von einem Moderator gelöscht.
Beitrag #7459104 wurde von einem Moderator gelöscht.
Beitrag #7459105 wurde von einem Moderator gelöscht.
Beitrag #7459106 wurde von einem Moderator gelöscht.
Beitrag #7459212 wurde von einem Moderator gelöscht.
Beitrag #7459213 wurde von einem Moderator gelöscht.
Beitrag #7459214 wurde von einem Moderator gelöscht.
Beitrag #7459222 wurde von einem Moderator gelöscht.
Beitrag #7459223 wurde von einem Moderator gelöscht.
Beitrag #7459228 wurde vom Autor gelöscht.
Beitrag #7459245 wurde von einem Moderator gelöscht.
Beitrag #7459246 wurde von einem Moderator gelöscht.
Beitrag #7459247 wurde von einem Moderator gelöscht.
Beitrag #7459255 wurde von einem Moderator gelöscht.
Beitrag #7459256 wurde von einem Moderator gelöscht.
Beitrag #7459257 wurde von einem Moderator gelöscht.
Beitrag #7459259 wurde von einem Moderator gelöscht.
Beitrag #7459261 wurde von einem Moderator gelöscht.
Beitrag #7459270 wurde von einem Moderator gelöscht.
Beitrag #7459271 wurde von einem Moderator gelöscht.
Beitrag #7459272 wurde von einem Moderator gelöscht.
Beitrag #7459273 wurde von einem Moderator gelöscht.
Beitrag #7459306 wurde von einem Moderator gelöscht.
Beitrag #7459307 wurde von einem Moderator gelöscht.
Beitrag #7459379 wurde von einem Moderator gelöscht.
Beitrag #7459380 wurde von einem Moderator gelöscht.
Beitrag #7459381 wurde von einem Moderator gelöscht.
Beitrag #7459382 wurde von einem Moderator gelöscht.
Beitrag #7459383 wurde von einem Moderator gelöscht.
Beitrag #7459388 wurde von einem Moderator gelöscht.
Beitrag #7459389 wurde von einem Moderator gelöscht.
Beitrag #7459390 wurde von einem Moderator gelöscht.
Beitrag #7459392 wurde von einem Moderator gelöscht.
Beitrag #7459393 wurde von einem Moderator gelöscht.
Beitrag #7459398 wurde von einem Moderator gelöscht.
Beitrag #7459399 wurde von einem Moderator gelöscht.
Beitrag #7459400 wurde von einem Moderator gelöscht.
Beitrag #7459401 wurde von einem Moderator gelöscht.
Beitrag #7459402 wurde von einem Moderator gelöscht.
von Michael W. (miks)


Lesenswert?

SUCH DIR ENDLICH HILFE!!!

Beitrag #7459416 wurde von einem Moderator gelöscht.
Beitrag #7459417 wurde von einem Moderator gelöscht.
Beitrag #7459418 wurde von einem Moderator gelöscht.
Beitrag #7459419 wurde von einem Moderator gelöscht.
Beitrag #7459420 wurde von einem Moderator gelöscht.
von Michael B. (laberkopp)


Lesenswert?

Wilhelm M. schrieb:
> Michael B. schrieb:
>> char *leaked=strdup("Something");
>
> Was hat das hier im Kontext von C++ zu suchen?
> Es dient nur dazu, damit Du Dein Wissen über exceptions hier einbringen
> kannst.

Oje Wilhelm, es ist ein Beispiel um zu zeigen warum man Klassen braucht.

Wenn du es nicht verstanden hast, schade.

Man kann dort auch beliebigen anderen Kram hinschreiben der irgendwas 
auf dem heap alloziert, mir fiel nichts kürzeres ein, was für jemanden 
dem nur C bekannt ist, unmittelbar verständlich ist.

Exceptions sind halt DER Grund warum man Klassen braucht. Klassen nur 
der Klassen wegen sind kein Grund, sondern höchstens ein nice to have.

Wobei es verdammt viele Programme gibt, die durch Klassen schlechter 
verständlich und schlechter wartbar und in der Performance schlechter 
wurden.

von Wilhelm M. (wimalopaan)


Lesenswert?

Michael B. schrieb:
> Exceptions sind halt DER Grund warum man Klassen braucht.

Nö: klares Nein.

von C-hater (c-hater)


Lesenswert?

Wilhelm M. schrieb:
> Michael B. schrieb:
>> Exceptions sind halt DER Grund warum man Klassen braucht.
>
> Nö: klares Nein.

Ich hätte nicht gedacht, dass ich irgendeiner der von dir geäusserten 
Meinungen mal zustimmen würde. Aber nu isses doch passiert. Also 1+

Beitrag #7459439 wurde von einem Moderator gelöscht.
Beitrag #7459440 wurde von einem Moderator gelöscht.
Beitrag #7459441 wurde von einem Moderator gelöscht.
Beitrag #7459442 wurde von einem Moderator gelöscht.
Beitrag #7459447 wurde von einem Moderator gelöscht.
Beitrag #7459452 wurde von einem Moderator gelöscht.
Beitrag #7459453 wurde von einem Moderator gelöscht.
Beitrag #7459454 wurde von einem Moderator gelöscht.
Beitrag #7459455 wurde von einem Moderator gelöscht.
von Rolf M. (rmagnus)


Lesenswert?

Michael B. schrieb:
>> Was hat das hier im Kontext von C++ zu suchen?
>> Es dient nur dazu, damit Du Dein Wissen über exceptions hier einbringen
>> kannst.
>
> Oje Wilhelm, es ist ein Beispiel um zu zeigen warum man Klassen braucht.

Der primäre Grund, warum es Klassen gibt, ist aber nicht, um Exceptions 
zu unterstützen, sondern …

Michael B. schrieb:
> Alles andere (Vererbung etc.) ist dann nur Zusatznutzen oder -ärger.

… Vererbung - und insbesondere darauf basierend Polymorphie.

> Exceptions sind halt DER Grund warum man Klassen braucht. Klassen nur
> der Klassen wegen sind kein Grund, sondern höchstens ein nice to have.

Klassen nutzt man, um die objektorientierte Denkweise umzusetzen. Wenn 
du das als "Klassen nur der Klassen wegen" betrachtest und den Mehrwert 
von Vererbung nicht verstanden hast, dann solltest du dir das nochmal 
anschauen. Sich jetzt gerade Exceptions als den einzigen Grund für 
Klassen auszusuchen, ist etwas seltsam.

> Wobei es verdammt viele Programme gibt, die durch Klassen schlechter
> verständlich und schlechter wartbar und in der Performance schlechter
> wurden.

Und vermutlich genau so viele, die durch Klassen übersichtlicher und 
deutlich besser wartbar sind. Die Verwendung von Klassen bedeutet auch 
nicht automatisch eine schlechtere Performance.

: Bearbeitet durch User
Beitrag #7459465 wurde von einem Moderator gelöscht.
Beitrag #7459466 wurde von einem Moderator gelöscht.
Beitrag #7459467 wurde von einem Moderator gelöscht.
Beitrag #7459468 wurde von einem Moderator gelöscht.
Beitrag #7459479 wurde von einem Moderator gelöscht.
von C-hater (c-hater)


Lesenswert?

Rolf M. schrieb:

> Die Verwendung von Klassen bedeutet auch
> nicht automatisch eine schlechtere Performance.

Das ist zwar theoretisch tatsächlich so, praktisch passiert aber genau 
dies fast immer. Der Fluch der Kapselung. Noch ohne jede Vererbung: Der 
Code der Klasse muß jederzeit den Datenbestand der Klasse konsistent 
halten, egal, welche der Mehoden in welcher Reihenfolge aufgerufen wird. 
Allein das impliziert schon fast immer einen gewissen Overhead.

Wenn dann aber noch Vererbung und insbesondere polymorphe Methoden 
hinzukommen, ist der Overhead sogar garantiert. Das ist theoretisch 
beweisbar (und natürlich vor Jahrzehnten bereits formal bewiesen 
worden).

Das ist halt das, was OOP in Kauf nimmt, um leicht verwendbare Objekte 
bieten zu können, die auch eine relativ hohe Sicherheit gegen 
Fehlbenutzung haben. Auf Perfomance war das OOP-Konzept niemals 
optimiert.

Aber das Hauptproblem ist wohl: diese Objekte sind ZU leicht zu 
verwenden. Keiner der "Programmierer", die Objekhierarchien Fremder 
benutzen, beschäftigt sich noch damit, was die benutzte Methode jeweils 
kostet und ob man das, was man letztlich will, nicht auch billiger haben 
könnte, selbst unter Benutzung desselben Objekts...

Das Problem ist also nicht OOP an sich, sondern unfähige "OO-Leecher". 
Früher(tm) habe ich die im Delphi-Umfeld "Komponentenschubser" genannt. 
Nunja, Delphi interessiert heute fast niemand mehr, aber der Typ des 
unfähigen Komponentenschubsers existiert wohl in jeder OO-Sprache und 
OO-Umgebung. OO-Systembedingt...

Und genau das ist, was OO-Anwendungen immer und immer langsamer macht...

von Sophie T. (sophie_t)


Lesenswert?

Der Trend geht aktuell von der OOP eher weg, siehe Rust. Da gibt es 
keine Vererbung. C++ bietet Mehrfachvererbung und da kommt man schnell 
in Teufels Küche. Exceptions werden auch nur genutzt, wenn es wirklich 
notwendig ist. Da kommt nämlich ein Overhead rein. Sonst macht man das 
wie in C mit irgendwelchen return codes. Mittlerweile gibt es ja 
std::optional das kommt ja schon nahe an Rust heran.

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Wilhelm M. schrieb:
> Michael B. schrieb:
>> Exceptions sind halt DER Grund warum man Klassen braucht.
>
> Nö: klares Nein.

Deine Argumentationskette ist umwerfend und so stichhaltig überzeugend.

Du solltest Politiker werden.

Rolf M. schrieb:
> Und vermutlich genau so viele, die durch Klassen übersichtlicher und
> deutlich besser wartbar sind.

Sicher nicht genau so viele, sondern die sind die Ausnahme.

Es gibt saubere Lehrbeispiele. Aber wenig reales Zeug dass mit so viel 
Mühe durchprogrammiett wurde.

> Die Verwendung von Klassen bedeutet auch
> nicht automatisch eine schlechtere Performance.

Jein, das Mitschleppen von self kostet IMMER Performance. Die müsste man 
durch Nutzung von 'features' wieder reinholen. Eines dieser features 
wären exceptions

Rolf M. schrieb:
> … Vererbung - und insbesondere darauf basierend Polymorphie.

Das ist OOP, geht auch ohne Klaasen, siehe Win16/32.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

C-hater schrieb:
> Wilhelm M. schrieb:
>> Michael B. schrieb:
>>> Exceptions sind halt DER Grund warum man Klassen braucht.
>>
>> Nö: klares Nein.
>
> Ich hätte nicht gedacht, dass ich irgendeiner der von dir geäusserten
> Meinungen mal zustimmen würde. Aber nu isses doch passiert. Also 1+

Geht mir genauso ... mal sehen, wo die Reise hin geht ;-)

von Wilhelm M. (wimalopaan)


Lesenswert?

Rolf M. schrieb:
> Der primäre Grund, warum es Klassen gibt, ist aber nicht, um Exceptions
> zu unterstützen, sondern …
>
> Michael B. schrieb:
>> Alles andere (Vererbung etc.) ist dann nur Zusatznutzen oder -ärger.
>
> … Vererbung - und insbesondere darauf basierend Polymorphie.

Auch da würde ich widersprechen: nicht Vererbung als Technik für 
Inklusionspolymorphie ist der hauptsächliche Beweggrund sondern die 
Kapselung und Abstraktion. Vererbung generell wird meistens überbewertet 
und nur Anfänger versuchen, alles in eine Klassenhierarchie zu pressen. 
Komposition ist wichtiger, und damit wieder die Kapselung und 
Abstraktion.

von Wilhelm M. (wimalopaan)


Lesenswert?

C-hater schrieb:
> Noch ohne jede Vererbung: Der
> Code der Klasse muß jederzeit den Datenbestand der Klasse konsistent
> halten, egal, welche der Mehoden in welcher Reihenfolge aufgerufen wird.
> Allein das impliziert schon fast immer einen gewissen Overhead.

Das suggeriert, dass man ohne OOP ganz locker mit Inkonsistenzen 
leichter leben könnte. Und das ist natürlich ab einer bestimmten Größe 
des SW-Artefaktes Blödsinn.

von Wilhelm M. (wimalopaan)


Lesenswert?

Michael B. schrieb:
> Wilhelm M. schrieb:
>> Michael B. schrieb:
>>> Exceptions sind halt DER Grund warum man Klassen braucht.
>>
>> Nö: klares Nein.
>
> Deine Argumentationskette ist umwerfend und so stichhaltig überzeugend.

Ja, weil Deine Aussage einfach (im Wortsinne) falsch ist. Den Rest kann 
man überall nachlesen, man starte bei Wikipedia. Das muss ich hier nicht 
wiederholen.

von Michael B. (laberkopp)


Lesenswert?

Wilhelm M. schrieb:
> Ja, weil Deine Aussage einfach (im Wortsinne) falsch ist. Den Rest kann
> man überall nachlesen, man starte bei Wikipedia. Das muss ich hier nicht
> wiederholen.

Du hast nicht mal nachgedacht, sondern plärrst stumpf das nach was du 
Mal aufgeschnappt hast nach. Armes Herdentier, bleibt dumm wie Brot.

Versuche mal herauszufinden, welche Abhangigkeiten es gibt und welche 
notwendige Vorbedingungen sind.

Als Ubung: warum Atom und Region der Kern von Windows sind.

Beitrag #7459621 wurde von einem Moderator gelöscht.
von Wilhelm M. (wimalopaan)


Lesenswert?

Michael B. schrieb:
> Wilhelm M. schrieb:
>> Ja, weil Deine Aussage einfach (im Wortsinne) falsch ist. Den Rest kann
>> man überall nachlesen, man starte bei Wikipedia. Das muss ich hier nicht
>> wiederholen.
>
> Du hast nicht mal nachgedacht,

Hellseher?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

C-hater schrieb:
> Der
> Code der Klasse muß jederzeit den Datenbestand der Klasse konsistent
> halten, egal, welche der Mehoden in welcher Reihenfolge aufgerufen wird.


Übersetzt und den Hasser Bias da mal raus genommen:
> Der Code der Klasse kann jederzeit den Datenbestand der Klasse konsistent
> halten.

Ja, das ist doch fantastisch!
C und ASM Anwender können nur von sowas träumen.
Oder müssen das mit viel Aufwand nachstricken, und es wird nur halb so 
gut.

Übrigens:
Kein Wort glaube ich deiner negativen Propaganda.
Auch weil sich irgendwann herausgestellt hat, dass du mindestens 11 
Jahre in der C++ Entwicklung verschlafen hast.
Interessieren würde mich mal, ob du dir jemals die Einarbeitungsphase, 
von min. 1/2 Jahr, angetan hast. Ob deine Gehirnwindungen C++ kompatibel 
sind. Ich meine, ob du überhaupt in der Lage bist, dich den, z.B. OOP, 
Konzepten positiv zuzuwenden.

Zu allen deinen Punkten kann man sagen:
> Wer will, findet Wege.
> Wer nicht will, (er)findet Gründe.

Beispiel:
C-hater schrieb:
> Keiner der "Programmierer", die Objekhierarchien Fremder
> benutzen, beschäftigt sich noch damit, was die benutzte Methode jeweils
> kostet und ob man das, was man letztlich will, nicht auch billiger haben
> könnte, selbst unter Benutzung desselben Objekts...
Erstens: Da steckt eine Pauschalisierung drin "keiner". 
Pauschalisierungen haben bestenfalls eine Wahrscheinlichkeit, eine 
Trefferwahrscheinlichkeit.
So auch eine Falschwahrscheinlichkeit. Die Ansage ist also in ihrer 
Absolutheit falsch.

Es kann schon sein, dass du deine offensichtliche Ablehnung auf solchen 
absolut Behauptungen aufbaust, um dich selber zu überzeugen. Würde es 
zumindest halbwegs erklären.
Tipp:
Je öfter du dir das vorbetest, desto fester glaubst du selber daran.

Beitrag #7459837 wurde von einem Moderator gelöscht.
Beitrag #7459838 wurde von einem Moderator gelöscht.
Beitrag #7459989 wurde von einem Moderator gelöscht.
Beitrag #7459990 wurde von einem Moderator gelöscht.
Beitrag #7459996 wurde von einem Moderator gelöscht.
Beitrag #7460017 wurde von einem Moderator gelöscht.
Beitrag #7460159 wurde von einem Moderator gelöscht.
Beitrag #7460160 wurde von einem Moderator gelöscht.
Beitrag #7460171 wurde von einem Moderator gelöscht.
Beitrag #7460172 wurde von einem Moderator gelöscht.
Beitrag #7460307 wurde von einem Moderator gelöscht.
Beitrag #7460308 wurde von einem Moderator gelöscht.
Beitrag #7460325 wurde von einem Moderator gelöscht.
Beitrag #7460374 wurde von einem Moderator gelöscht.
Beitrag #7460706 wurde von einem Moderator gelöscht.
Beitrag #7460707 wurde von einem Moderator gelöscht.
Beitrag #7460712 wurde von einem Moderator gelöscht.
Beitrag #7460713 wurde von einem Moderator gelöscht.
Beitrag #7460724 wurde von einem Moderator gelöscht.
Beitrag #7460725 wurde von einem Moderator gelöscht.
Beitrag #7460737 wurde von einem Moderator gelöscht.
Beitrag #7460738 wurde von einem Moderator gelöscht.
Beitrag #7460750 wurde von einem Moderator gelöscht.
Beitrag #7460751 wurde von einem Moderator gelöscht.
Beitrag #7460760 wurde von einem Moderator gelöscht.
Beitrag #7460761 wurde von einem Moderator gelöscht.
Beitrag #7460765 wurde von einem Moderator gelöscht.
Beitrag #7460773 wurde von einem Moderator gelöscht.
Beitrag #7460774 wurde von einem Moderator gelöscht.
Beitrag #7460794 wurde von einem Moderator gelöscht.
Beitrag #7460795 wurde von einem Moderator gelöscht.
Beitrag #7460801 wurde vom Autor gelöscht.
Beitrag #7460808 wurde von einem Moderator gelöscht.
Beitrag #7460809 wurde von einem Moderator gelöscht.
Beitrag #7460823 wurde von einem Moderator gelöscht.
Beitrag #7460824 wurde von einem Moderator gelöscht.
von C-hater (c-hater)


Lesenswert?

Wilhelm M. schrieb:

> Das suggeriert, dass man ohne OOP ganz locker mit Inkonsistenzen
> leichter leben könnte.

Nein, das ist natürlich nicht so.

Es ist vielmehr so: da es ohne OOP die Garantie nicht gibt, dass der 
Datenbestand bei beliebiger Aufrufreihenfolge der Methoden (dann also 
keine Methoden, sondern Funktionen) konsistent bleiben wird, kann man 
einfach eine bestimmte Reihenfolge VORSCHREIBEN.

Also z.B. sowas (sehr einfacher Fall): "bevor irgendeine andere 
xyz_-Funktion aufgerufen werden darf muß einmalig xyz_init aufgerufen 
werden".

Die Crux des Objektes ist halt: das muss das selber prüfen, in aller 
Regel zur Laufzeit. Das kostet Zeit und Codespace. Das Nicht-Objekt mit 
derselben Funktionalität kann auf diese Prüfungen verzichten, da die 
Einhaltung der Restriktionen dem Benutzer obliegt.

Kannst du dir genauso vorstellen, wie die UB-Scheiße in C/C++. Auch hier 
wird der Benutzer dazu verdonnert, einfach alles richtig zu machen...

Beitrag #7460866 wurde von einem Moderator gelöscht.
Beitrag #7460894 wurde von einem Moderator gelöscht.
Beitrag #7460895 wurde von einem Moderator gelöscht.
von C-hater (c-hater)


Lesenswert?

Arduino F. schrieb:

> Ich meine, ob du überhaupt in der Lage bist, dich den, z.B. OOP,
> Konzepten positiv zuzuwenden.

Ich habe wahrscheinlich schon OOP betrieben, da warst du noch das 
lüsterne Glitzern in den Augen deines Vaters.

Konkret: Anfang der 1990er.

Beitrag #7460917 wurde von einem Moderator gelöscht.
Beitrag #7460943 wurde von einem Moderator gelöscht.
Beitrag #7460945 wurde von einem Moderator gelöscht.
Beitrag #7460968 wurde von einem Moderator gelöscht.
Beitrag #7460982 wurde von einem Moderator gelöscht.
Beitrag #7460983 wurde von einem Moderator gelöscht.
Beitrag #7460998 wurde von einem Moderator gelöscht.
Beitrag #7460999 wurde von einem Moderator gelöscht.
von Ein T. (ein_typ)


Lesenswert?

C-hater schrieb:
> Ich habe wahrscheinlich schon OOP betrieben, da warst du noch das
> lüsterne Glitzern in den Augen deines Vaters.
>
> Konkret: Anfang der 1990er.

Da wäre es doch super, wenn Du Dir endlich mal wenigstens einen leisen 
Hauch von einer Ahnung zulegen würdest.

von Michael B. (laberkopp)


Lesenswert?

C-hater schrieb:
> Ich habe wahrscheinlich schon OOP betrieben, da warst du noch das
> lüsterne Glitzern in den Augen deines Vaters.
> Konkret: Anfang der 1990er.

Cool, voll der Experte.

1990 war Smalltalk schon 18 Jahre erwachsen, aber du weisst sicher nicht 
dass diese das Paradebeispiel für Objektorientierung war. 1990 war es 
schliesslich eher wieder out, weil die Leute spätestens als es 1980 
widespread wurde langsam merkten, dass man damit keine konkurrenzfähigen 
Programme schreiben konnte.

von Ein T. (ein_typ)


Lesenswert?

Michael B. schrieb:
> C-hater schrieb:
>> Konkret: Anfang der 1990er.
>
> 1990 war Smalltalk schon 18 Jahre erwachsen,

Der Punkt ist nicht, wie lange man glaubt, OOP zu machen, oder zu 
wissen, wann das Paradigma mit welcher Sprache entwickelt wurde -- 
nebenbei: das war nicht Smalltalk. Der Punkt ist vielmehr, ob man die 
Objektorientierung verstanden habt -- und solltet Ihr beide das haben, 
habt Ihr es zumindest vor mir sehr erfolgreich verborgen.

Beitrag #7461393 wurde von einem Moderator gelöscht.
Beitrag #7461394 wurde von einem Moderator gelöscht.
Beitrag #7461398 wurde von einem Moderator gelöscht.
Beitrag #7461399 wurde von einem Moderator gelöscht.
Beitrag #7461474 wurde von einem Moderator gelöscht.
Beitrag #7461506 wurde von einem Moderator gelöscht.
Beitrag #7461507 wurde von einem Moderator gelöscht.
Beitrag #7461567 wurde von einem Moderator gelöscht.
Beitrag #7461568 wurde von einem Moderator gelöscht.
Beitrag #7461814 wurde von einem Moderator gelöscht.
Beitrag #7461815 wurde von einem Moderator gelöscht.
Beitrag #7461944 wurde von einem Moderator gelöscht.
Beitrag #7461945 wurde von einem Moderator gelöscht.
Beitrag #7462106 wurde von einem Moderator gelöscht.
Beitrag #7462107 wurde von einem Moderator gelöscht.
Beitrag #7462113 wurde von einem Moderator gelöscht.
Beitrag #7462128 wurde von einem Moderator gelöscht.
Beitrag #7462140 wurde von einem Moderator gelöscht.
Beitrag #7462141 wurde von einem Moderator gelöscht.
Beitrag #7462147 wurde von einem Moderator gelöscht.
Beitrag #7462148 wurde von einem Moderator gelöscht.
Beitrag #7463034 wurde von einem Moderator gelöscht.
Beitrag #7463035 wurde von einem Moderator gelöscht.
Beitrag #7463052 wurde von einem Moderator gelöscht.
Beitrag #7463054 wurde von einem Moderator gelöscht.
Beitrag #7463076 wurde von einem Moderator gelöscht.
Beitrag #7463084 wurde von einem Moderator gelöscht.
Beitrag #7463088 wurde von einem Moderator gelöscht.
Beitrag #7463091 wurde von einem Moderator gelöscht.
Beitrag #7463095 wurde von einem Moderator gelöscht.
Beitrag #7463096 wurde von einem Moderator gelöscht.
Beitrag #7463109 wurde von einem Moderator gelöscht.
Beitrag #7463116 wurde von einem Moderator gelöscht.
Beitrag #7463122 wurde von einem Moderator gelöscht.
Beitrag #7463123 wurde von einem Moderator gelöscht.
Beitrag #7463124 wurde von einem Moderator gelöscht.
Beitrag #7463125 wurde von einem Moderator gelöscht.
Beitrag #7463126 wurde von einem Moderator gelöscht.
Beitrag #7463127 wurde von einem Moderator gelöscht.
Beitrag #7463128 wurde von einem Moderator gelöscht.
Beitrag #7463130 wurde von einem Moderator gelöscht.
Beitrag #7463131 wurde von einem Moderator gelöscht.
Beitrag #7463132 wurde von einem Moderator gelöscht.
Beitrag #7463134 wurde von einem Moderator gelöscht.
Beitrag #7463136 wurde von einem Moderator gelöscht.
Beitrag #7463143 wurde von einem Moderator gelöscht.
Beitrag #7463144 wurde von einem Moderator gelöscht.
Beitrag #7463569 wurde von einem Moderator gelöscht.
Beitrag #7463570 wurde von einem Moderator gelöscht.
Beitrag #7463585 wurde von einem Moderator gelöscht.
Beitrag #7463586 wurde von einem Moderator gelöscht.
Beitrag #7464020 wurde von einem Moderator gelöscht.
Beitrag #7464021 wurde von einem Moderator gelöscht.
Beitrag #7464221 wurde von einem Moderator gelöscht.
Beitrag #7464222 wurde von einem Moderator gelöscht.
Beitrag #7464458 wurde von einem Moderator gelöscht.
Beitrag #7464459 wurde von einem Moderator gelöscht.
Beitrag #7464462 wurde von einem Moderator gelöscht.
Beitrag #7464463 wurde vom Autor gelöscht.
Beitrag #7464472 wurde von einem Moderator gelöscht.
Beitrag #7464474 wurde von einem Moderator gelöscht.
Beitrag #7464480 wurde vom Autor gelöscht.
von C-hater (c-hater)


Lesenswert?

Ein T. schrieb:

> Der Punkt ist nicht, wie lange man glaubt, OOP zu machen, oder zu
> wissen, wann das Paradigma mit welcher Sprache entwickelt wurde --
> nebenbei: das war nicht Smalltalk. Der Punkt ist vielmehr, ob man die
> Objektorientierung verstanden habt

Also, ich denke, das habe ich. Ich kenne und verstehe nicht nur das 
Konzept, sondern weiss auch bis in's letzte Detail, wie es physisch 
umgesetzt wird. Zumindest für Delphi und .net (also zumindest für C# und 
VB). Bei C++ nur für den Teil, der tatsächlich zu Code wird, das reine 
Compilezeit-Geraffel ist mir zu unleserlich, das kann man niemandem 
ernsthaft zumuten. Ist aber sehr wahrscheinlich genau das Feature, was 
im (kleinen) µC-Bereich überhaupt nur sinnvoll nutzbar ist.
Mag sein, das tue ich mir trotzdem vor der Rente nicht mehr an. Zumal 
auch meine sehr viel jüngeren Kollegen damit nicht warm werden. Auch für 
die scheint das unlesbar (und insbesondere auch: undebugbar). Die wollen 
das genau so wenig wie ich.

> und solltet Ihr beide das haben,
> habt Ihr es zumindest vor mir sehr erfolgreich verborgen.

Das mag in meinem Fall daran liegen, dass ich den allergrößten Teil des 
Codes, den ich produziere, nicht veröffentlichen darf, selbst wenn ich 
es wollen würde. Weil ich zwar der Urheber bin, aber mein Brötchengeber 
die Rechte daran besitzt.

Beitrag #7464515 wurde von einem Moderator gelöscht.
Beitrag #7464516 wurde von einem Moderator gelöscht.
Beitrag #7464557 wurde von einem Moderator gelöscht.
Beitrag #7464558 wurde von einem Moderator gelöscht.
Beitrag #7464599 wurde von einem Moderator gelöscht.
Beitrag #7464600 wurde von einem Moderator gelöscht.
Beitrag #7464607 wurde von einem Moderator gelöscht.
Beitrag #7464608 wurde von einem Moderator gelöscht.
Beitrag #7464971 wurde von einem Moderator gelöscht.
Beitrag #7464972 wurde von einem Moderator gelöscht.
Beitrag #7465300 wurde von einem Moderator gelöscht.
Beitrag #7465301 wurde von einem Moderator gelöscht.
Beitrag #7465319 wurde von einem Moderator gelöscht.
Beitrag #7465320 wurde von einem Moderator gelöscht.
Beitrag #7465337 wurde von einem Moderator gelöscht.
Beitrag #7465338 wurde von einem Moderator gelöscht.
Beitrag #7465364 wurde von einem Moderator gelöscht.
Beitrag #7465365 wurde von einem Moderator gelöscht.
Beitrag #7465382 wurde von einem Moderator gelöscht.
Beitrag #7465383 wurde von einem Moderator gelöscht.
Beitrag #7465389 wurde von einem Moderator gelöscht.
Beitrag #7465390 wurde von einem Moderator gelöscht.
Beitrag #7465427 wurde von einem Moderator gelöscht.
Beitrag #7465428 wurde von einem Moderator gelöscht.
Beitrag #7465446 wurde von einem Moderator gelöscht.
Beitrag #7465448 wurde von einem Moderator gelöscht.
Beitrag #7465450 wurde von einem Moderator gelöscht.
Beitrag #7465658 wurde von einem Moderator gelöscht.
Beitrag #7465660 wurde von einem Moderator gelöscht.
Beitrag #7465665 wurde von einem Moderator gelöscht.
Beitrag #7465666 wurde von einem Moderator gelöscht.
Beitrag #7466104 wurde von einem Moderator gelöscht.
Beitrag #7466105 wurde von einem Moderator gelöscht.
Beitrag #7466335 wurde von einem Moderator gelöscht.
Beitrag #7466337 wurde von einem Moderator gelöscht.
Beitrag #7466380 wurde von einem Moderator gelöscht.
Beitrag #7466381 wurde von einem Moderator gelöscht.
Beitrag #7466392 wurde vom Autor gelöscht.
Beitrag #7466406 wurde von einem Moderator gelöscht.
Beitrag #7466492 wurde von einem Moderator gelöscht.
Beitrag #7466493 wurde von einem Moderator gelöscht.
Beitrag #7466498 wurde von einem Moderator gelöscht.
Beitrag #7466499 wurde von einem Moderator gelöscht.
Beitrag #7466909 wurde von einem Moderator gelöscht.
Beitrag #7466911 wurde von einem Moderator gelöscht.
Beitrag #7467332 wurde von einem Moderator gelöscht.
Beitrag #7467333 wurde von einem Moderator gelöscht.
Beitrag #7467338 wurde von einem Moderator gelöscht.
Beitrag #7467348 wurde von einem Moderator gelöscht.
Beitrag #7467349 wurde von einem Moderator gelöscht.
Beitrag #7467359 wurde von einem Moderator gelöscht.
Beitrag #7467747 wurde von einem Moderator gelöscht.
Beitrag #7467748 wurde von einem Moderator gelöscht.
Beitrag #7467752 wurde vom Autor gelöscht.
Beitrag #7467757 wurde von einem Moderator gelöscht.
Beitrag #7467758 wurde von einem Moderator gelöscht.
Beitrag #7467761 wurde vom Autor gelöscht.
Beitrag #7467762 wurde von einem Moderator gelöscht.
Beitrag #7467764 wurde von einem Moderator gelöscht.
Beitrag #7467773 wurde von einem Moderator gelöscht.
Beitrag #7467774 wurde von einem Moderator gelöscht.
Beitrag #7467775 wurde vom Autor gelöscht.
Beitrag #7467778 wurde von einem Moderator gelöscht.
Beitrag #7467780 wurde von einem Moderator gelöscht.
Beitrag #7467793 wurde von einem Moderator gelöscht.
Beitrag #7467800 wurde von einem Moderator gelöscht.
Beitrag #7467801 wurde von einem Moderator gelöscht.
Beitrag #7467805 wurde von einem Moderator gelöscht.
Beitrag #7467807 wurde von einem Moderator gelöscht.
Beitrag #7467813 wurde von einem Moderator gelöscht.
Beitrag #7467814 wurde von einem Moderator gelöscht.
Beitrag #7467815 wurde von einem Moderator gelöscht.
Beitrag #7467829 wurde von einem Moderator gelöscht.
Beitrag #7467852 wurde von einem Moderator gelöscht.
Beitrag #7467853 wurde von einem Moderator gelöscht.
Beitrag #7467854 wurde vom Autor gelöscht.
Beitrag #7467872 wurde von einem Moderator gelöscht.
Beitrag #7467873 wurde von einem Moderator gelöscht.
Beitrag #7467874 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.