INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Anfängerfragen zu Klassen
17.01.2019, 20:40
Beitrag #1
Anfängerfragen zu Klassen
Hallo an die Gemeinde,

ich versuche gerade zu verstehen wie Klassen mit dazugehörigen Methoden aufgebaut sind und wie man das grundlegend programmiert. Dazu eine Frage anhand eines .h Codes, geklaut aus einem Arduino.cc Tutorial:

Code:
class Morse
{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;
};
Wie ich mich bereits belesen habe handelt es sich unter "public" bei Morse(int pin); wohl um den sogenannten Konstruktor, anhand dessen der "pin" beim ersten Durchlauf initialisiert wird. Es gibt jedoch auch Klassen bei denen je nach Verwendungszweck nur ein oder wahlweise mehrere Parameter übergeben werden können. Wie wird sowas geschrieben?

Wo kann ich Variablen für den reinen "private" Gebrauch für die erste Verwendung initialisieren, in der .h oder in der .cpp oder gar beiden?

hier wird vom Initialisieren einer Variable innerhalb der .cpp gesprochen:
Code:
EineKlasse::EineKlasse()
: m_eineVariable(0)
{
  // weitere Initialisierungen des Objekts
}

bedeutet dieses
Code:
: m_eineVariable(0)
etwa das gleiche wie im "normalen" Programmablauf ein
Code:
int m_eineVariable = 0;
???

ich bedanke mich schon im Voraus für die Bemühungen die Knoten aus meiner Hirnrinde zu lösen!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2019, 21:15
Beitrag #2
RE: Anfängerfragen zu Klassen
Die Grundlagen der OOP zu vermitteln ist nicht ganz einfach, zumal es viele Wege gibt, ein Ziel zu erreichen.
Wir hatten Ende des Jahres eine längere Diskussion mit guten Beispielen im Nachbarforum. Den einen Troll, der immer alles fordert und nichts auf die Reihe bekommt, musst Du ausblenden.

Ansonsten kann ich das Buch der "C++ Programmierer" empfehlen. Es ist mit 1000 Seiten zwar ein ganz schöner Wälzer, es lohnt sich aber.
Speziell für Arduino gibt es eigentlich nichts an Grundlagenwerken zu C++.

Der Hauptgedanke bei OOP ist die Kapselung, d.h. nur das, was unbedingt notwendig ist, wird nach Außen sichtbar (public) gemacht. Auf Variablen wird nur über Methoden zugegriffen.
Schon für Konstruktoren gibt es mindestens 4 Vorgehensweisen.

Das soll Dich nicht abschrecken. Viele Libs sind als Klassen geschrieben, da kann man auch mal schauen, was die machen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2019, 23:34
Beitrag #3
RE: Anfängerfragen zu Klassen
Hallo,

Tommy hat den Punkt getroffen: Das Klassenkonzept ist nicht einfach zu verstehen und C++ ist sehr komplex. Das von Tommy empfohlene Buch kenne ich nicht, die Rezensionen sind allerdings sehr positiv. Du investierst 50 € und hast bestimmt für die nächsten Jahre Infos genug.

Zusätzlich oder alternativ suche mal "Einführung objektorientierte Programmierung". Da findest Du jede Menge Material von entsprechenden Kursen an Hochschulen. Dies fand ich z. B. gut:
http://www.dbs.ifi.lmu.de/Lehre/EIP/WS12...gen-01.pdf

Ich habe Programmieren (professionell) vor der "Verbreitung" der Klassen gelernt. Das Verstehen der objektorientierten Programmierung war nicht leicht, heute möchte ich nicht mehr ohne Klassen programmieren.

Zu den *.h und *.cpp Dateien: Die*.h Datei ist öffentlich mit den Deklarationen aller Klassen usw. Die *.cpp Datei dazu enthält den eigentlich Code. Der Witz: Man kann die *.cpp Datei compilieren und erst das Resultat dem Projekt zufügen (Linken); ein Software-Hersteller kann so die compilierte Version verkaufen ohne , dass die Käufer die Geheiminisse in der Software erfahren. In der Atduinowelt ist das unüblich, fast alles ist offen. Daraus ergibt sich aber die Antwort auf Deine Frage: Man kann den gesamten Code auch in die *.h Datei packen. Um den Compiler zu beruhigen legt man eine *.cpp Datei als Dummy an. (Nicht erfunden, habe ich gerade in einer Library so gesehen.)

Viel Erfolg
Gruß GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2019, 10:21
Beitrag #4
RE: Anfängerfragen zu Klassen
Ich schließe mich den Vorrednern an.
Man programmiert heute vor Allem Objektorientiert, weil das extrem der Übersichtlichkeit hilft.
Dir das im Forum beizubringen ist unmöglich. Erfahrungsgemäß sitzen Leute durchaus mal 1 Jahr an der objektorientierten Programmierung (OOP), bis sie es intus haben.

Und selbst wenn man Objektorientiert programmieren kann, hat man immer noch nicht die Programmierparadigmen verinnerlicht:
DRY, Failfast, KISS, LC/HC, SOLID, etc.

Ich kann dich nur auf die Reise schicken und die viel Spaß wünschen!

In der heutigen Zeit ist gesunder Menschenverstand so etwas Ähnliches wie eine Superkraft - aber keine nützliche.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2019, 13:20
Beitrag #5
RE: Anfängerfragen zu Klassen
Vielen Dank an alle Antworter!
ja, da habe ich mir ein Gebiet eröffnet :-)

herzlichen Dank für den Buchtipp, ich werde mir den Wälzer "Der C++ Programmierer" holen.
Trotz meiner sehr begrenzten Zeit habe ich gerade etwas herum experimentiert und bin zumindest um einen Aha-Effekt
reicher. Ich habe versucht mittels einer Klasse "Taster" und Methode "boolean toggeln()" einen Zustand zu switchen und dabei
schonmal gemerkt dass es sich hier nicht so verhält wie zwischen normalen Funktionsaufrufen, d.h. die Zustände bleiben zwischen
den Aufrufen erhalten und ich muss hier nicht mit static-Variablen arbeiten.
Hier mein Versuchscode:
Code:
// Taster.h

#ifndef Taster_h
#define Taster_h

#include "Arduino.h"


class Taster
{
  public:
    Taster(int pin);
    boolean toggeln();

  private:
    int _pin;
    int _tasterZustand;
    int _letzterTasterZustand;
    boolean _ausgabeZustand;
};

#endif

sowie

Code:
// Taster.cpp

#include "Arduino.h"
#include "Taster.h"

Taster::Taster(int pin)
{
  pinMode(pin, INPUT_PULLUP);
  _pin = pin;
  _letzterTasterZustand = HIGH;
  _ausgabeZustand = false;
}

boolean Taster::toggeln()
{
  _tasterZustand = digitalRead(_pin);

  if (_tasterZustand != _letzterTasterZustand)
    {
      if (_tasterZustand == LOW)
        {
          _ausgabeZustand = !_ausgabeZustand;
        }
     }

   _letzterTasterZustand = _tasterZustand;

  if (_ausgabeZustand == true) {return true;}

  else {return false;}

}
und schliesslich der Testsketch
Code:
#include <Taster.h>

#define LEDPIN 7

Taster myTaster(5);

void setup() {
pinMode(LEDPIN, OUTPUT);
}

void loop() {
if (myTaster.toggeln())
  {
    digitalWrite(LEDPIN, HIGH);
  }
else
  {
    digitalWrite(LEDPIN, LOW);
  }
}

ok, es geht ans lesen, lesen, lesen und irgendwann ans verstehen :-)

vielen Dank an alle!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2019, 17:23 (Dieser Beitrag wurde zuletzt bearbeitet: 18.01.2019 17:24 von Tommy56.)
Beitrag #6
RE: Anfängerfragen zu Klassen
[quote='HarryS' pid='55369' dateline='1547814028']
Code:
private:
    int _pin;
    int _tasterZustand;
    int _letzterTasterZustand;
    boolean _ausgabeZustand;

Die Variablen werden für jede Instanz extra gehalten. Der Code nur ein Mal für alle Instanzen.

Grob gesagt, ist die Klasse der Bauplan und die konkrete Instanz, die Du mit dem Konstruktor anlegt, ist die reale Ausprägung.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2019, 21:15
Beitrag #7
RE: Anfängerfragen zu Klassen
Hallo Tommy,

Zitat:Die Variablen werden für jede Instanz extra gehalten. Der Code nur ein Mal für alle Instanzen.

wie meinst Du das in Verbindung mit dem von mir geposteten Code?

Heisst das dass ich die private - Variablen in jeder Instanz in der .cpp Datei deklarieren sollte?

Ich muss doch alle Variablen die im Code verwendet werden in der Headerdatei aufführen?

Oder meinst Du das formhalber dass in der .h erst die jeweilige Instanz aufgeführt wird und danach die zugehörigen Variablen, quasi übersichtshalber, der Reihenfolge nach?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2019, 16:03 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2019 16:19 von Vapalus.)
Beitrag #8
RE: Anfängerfragen zu Klassen
Tommy meinte eher so etwas wie:
Bei Objektorientierung ist das, was du schreibst, technisch gesehen der Prototyp dessen, was dann später ausgeführt wird.
Man könnte es mit einem Bauplan vergleichen, z.B. für ein Auto, ein Motorrad oder ein Fahrrad (ich lass hier mal die Vererbung weg).
Wenn ich also einen Bauplan für ein Fahrrad schreibe, kann ich das System viele, viele Fahrräder bauen lassen (und den RAM vollschreiben, das nennt man Memory Leak).

Du hast bereits vor "Setup" das System einen Taster "bauen lassen"

Taster myTaster(5);

(und zwar im Stack und nicht im Heap.)

Dieser eine Taster, den du gebaut hast, merkt sich solange er lebt welchen Zustand er hat. Und da du ihn in der Hauptdatei, der "main", gleich am Anfang definiert hast, lebt das Objekt bis du den Arduino stoppst.

Und wenn du folgendes nicht verstanden hast:
-Memory Leak
-Heap
-Stack
-main

dann würde ich an deiner Stelle das Buch lesen und ganz am Anfang anfangen, sonst brennt dir bald der Hut.

In der heutigen Zeit ist gesunder Menschenverstand so etwas Ähnliches wie eine Superkraft - aber keine nützliche.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hilfe benötigt beim Verknüpfen von Klassen Batucada 7 419 02.03.2019 23:47
Letzter Beitrag: georg01
  Zentrale Variablen für verschiedene Klassen Smirgel 3 440 29.10.2018 21:24
Letzter Beitrag: Tommy56
  Problem mit Klassen GuaAck 4 1.643 09.08.2017 09:28
Letzter Beitrag: MicroBahner
Thumbs Up Klassen Definition Lokal - Global oOSpikeOo 3 1.032 18.03.2017 17:09
Letzter Beitrag: oOSpikeOo
  Anfängerfragen! hgranzer 2 968 25.04.2015 14:26
Letzter Beitrag: hgranzer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste