Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
14.08.2003, 17:45
Quak



Ich versuche gerade mithilfe des Buches „Visual C++6.0“ von H.-J. Scheibel C++ zu lernen. Ich habe mich bissher erfolgreich durch die erten 2 Kapitel gekämpft und meine alles verstanden zu haben. Allerdings bin ich jetzt in Kapitel 3 „Objektorientierte Programierung“
an folgendem Beispiel hängen geblieben.

Zitat:

//Übung U031 Klasse CDatum

#include <IOSTREAM.H>

//zuerst einige allgemeine verwendete INLINE Funktionen (Makros)
inline int Max(int a, int b) {return a>b ? a:b;}
inline int Min(int a, int b) {return a>b ? b:a;}

class CDatum
{
public:
CDatum(int Tg,int Mt,int Jr); //Konstruktor
void Zeige(); //Bildschirmausgabe
~CDatum(); //Destruktor
private:
int Jahr,Monat,Tag; //private Datenelemente
}; //END class CDatum

//Implementationen

//Konstruktor der Klasse CDatum
CDatum::CDatum(int Tg,int Mt,int Jr)
{
static int Laenge[]={31,28,31,30,31,30,31,31,30,31,30,31};

Monat=Max(1,Mt);
Monat=Min(Monat,12);
Tag =Max(1,Tg);
Tag =Min(Tag,Laenge[Monat-1]);
Jahr =Max(1,Jr);
} //END CDatum::CDatum(int Tg,int Mt,int Jr)

//Methode der Klasse CDatum zur Bildschirmausgabe
void CDatum::Zeige()
{
static char *Name[]=
{"Januar","Februar","März","April","Mai","Juni","Juli",
"August","September","Oktober","November","Dezember"
}; //END static char *Name[]

cout << Tag << ". " << Name[Monat-1] << " " << Jahr;
} //END CDatum::zeige()

//Destruktor der Klasse CDatum
CDatum::~CDatum()
{
//Dies ist nur ein Platzhalter
} //END CDatum::~CDatum()

void main()
{
CDatum Datum1(24,12,1999); //Instantiierung eines gültigen Datums
CDatum Datum2(35,28,-1999); //Instantiierung eines ungültigen Datums

Datum1.Zeige(); cout << "\n"; //Bildschirmausgabe
Datum2.Zeige(); cout << "\n";

} //END U031

Ich versuche mal meine Sicht der Dinge zu geben:
Die „inline“ Funktion ist mir schon mal unklar und ich sehe keinen Sinn wozu sie benötigt wird. Dann wird die Klasse CDatum deklariert (fals ich falsche Ausdrücke verwende bitte korrigieren). Der Konstruktor, die Bildschirmausgabe und der Destruktor sind Methoden der Klasse CDatum. Das „privat:“ ist auch eine Methode, hier werden die persönlichen Daten des Benutzers bearbeitet.
Dann kommt das eigentkiche „Programm“. Static int Laenge verstehe ich noch aber ich hab keinen Schimmer, was diese ganz Max´s und Min´s und die Klammern dahinter bedeuten.
Den Rest habe ich glaube ich verstanden.
Bitte helft mir das Programm zu verstehen :)
Thx
Quak

--

Coder @ Heat

zum Seitenanfang zum Seitenende Profil || Suche
001
14.08.2003, 20:24
K-Putt



Mit der Deklaration der Klasse CDatum liegst du richtig, Konstruktor, Destruktor passt auch.
public und private sind allerdings keine methoden, und private hat nichts damit zu tun dass hier benutzereingaben verarbeitet werden, das ergibt sich halt aus so in dem beispiel.
Auf Methoden/Variablen die unter public: stehen kannst du von außerhalb der klasse zugreifen. Beispiel: Die Zeige() Funktion, auf die wird in der main() funktion zugegriffen.
Auf Methoden/Variablen die unter private: stehen kannst du nur innerhalb einer Klasse zugreifen. Beispiel: die Jahr, Monat, Tag variable.
Dies dient dazu dass die Variable nicht von außerhalb der klasse verändert werden.

Max() und Min() sind inline funktionen, ganz genau kann ich dir das nicht erklären, aber jedenfalls werden solche funktionen als inline deklariert die besonders schnell ausgeführt werden müssen und simplen code enthalten.
Ich nehme an das die beiden Funktionen irgend einen wert zurück geben, allerdings ist der code der beiden inline's zu kompliziert für mich zum Lesen.

Du siehst ja dass sie
Quellcode:Monat=Max(1,Mt);
wie ganz normale Funktionen verwendet werden und einen Wert zurückgeben der dann in der Variable "Monat" zu finden ist.

Das sollte erstmal die gröbsten Fragen beantworten ;)

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database


Dieser Beitrag wurde am 14.08.2003 um 20:24 von K-Putt bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
14.08.2003, 20:28
the_viking



Also ich erklär's dir ;)

1. Da oben werden zwei Funktionen
Max() und Min()
Deklariert. Was sie machen, sollte ersichtlich sein: Sie geben entweder den maximalen (max) Wert der zwei Parameter zurück oder den kleinsten (min).
Das inline bedeutet, das der Compiler die Funktionen nicht als richtige Funktionen behandelt, sondern den Code sozusagen "ersetzt". D.h. für jeden Funktionsaufruf einer inline-Funktion wird der komplette code der Funktion an diese Stelle geschrieben. Der sogenannte Funktion-Overhead (ne menge sachen auf den Stack pushen und dann zur Funktion springen sowie der Rücksprung) fällt damit weg.

2. Die ganzen Min()s und Max()s wären damit ja auch erklärt (denke ich mal). Sie dienen da anscheinend, um negative Tage bzw. 0-Tage herauszufiltern.

3. Das Schlüsselwort "static" bedeutet, das der Speicher für diese Variable nur einmal reserviert wird. Auch in Klassen. D.h. statische Variablen in Klassen können sozusagen wie globale Variablen behandelt werden. Zugriff könnte man z.B. ebenso mit CDatum::Laenge erhalten.
Wenn man also zwei Instanzen einer Klasse hat (zB CStatic (Variable m_iNum ist static, sowie eine Funktion Add(), die m_iNum um eins inkrementiert), so würde folgendes passieren:

int CStatic::m_iNum = 0;

CStatic a,b;
a.Add();
b.Add();
a.Add();

printf("%d",CStatic::m_iNum);

So wäre die Ausgabe:
3

Ich hoffe, ich hab es dir anschaulich erklärt. Wenn noch Fragen offen sind, immer her damit ;)

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
003
14.08.2003, 20:54
Quak



Erstmal vielen Dank für die Mühe :)
Ich werd mir das Ganze jetzt mal durch den Kopf gehen lassen (am besten über nacht). Das Angebot mit den offenen Fragen nehme ich gerne an soblad ich wieder welche habe ;)

--

Coder @ Heat


Dieser Beitrag wurde am 14.08.2003 um 21:00 von Quak bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
15.08.2003, 12:06
Quak



Also: Nach einer (fast) schlaflosen Nacht presentiere ich mal meine (Denk)Ergebnisse: 1. Die "inline"-Funktion ist mir immer noch nicht gaaaanz klar, ich habe sie als allgemeingültige Formel aufgefasst in der man die Variablen a und b ersetzten kann. Z.b. "Monat=Max(1,Mt)" kann man dann folgendermaßen in die "inline"-Formel einsetzen "Monat=Max(int 1, int Mt) {return 1>Mt ? 1:Mt;}". 2. Ich versuche mal die Arbeitsweise des Programms nachzuvollziehen: Alles beginnt bei main(). Die Instanze "CDatum Datum1(24,12,1999)" gibt Datum1 einen Wert und einen Zeiger auf die Klasse CDatum.
Von dort gehen die Daten in den Konstruktor der CDatum(int 24,int 12,int 1999) verarbeitet. Dann gehen die daten in die Bildschirmausgabe (Zeige()).
Aus main() weiß die Bildschirmausgabe das sie Datum1 ausgeben soll.
Zum Schluss löscht der Destruktor die Daten aus dem Speicher.
So ich hoffe ich habe das Meiste richtig verstanden und das ich korrigiert werde wenn das nicht der Fall ist :)

--

Coder @ Heat

zum Seitenanfang zum Seitenende Profil || Suche
005
16.08.2003, 16:11
Leviathan



Das inline ist hier nicht so wichtig, da der Compiler es sowieso ignorieren kann und es für den Programmierer kaum Unterschiede macht (nur die Implementierung muss mit inkludiert sein, da inline-Funktionen vom Compiler und nicht vom Linker in das Programm gesetzt werden).
Die einzige Möglichkeit, eine Funktion sicher mit jedem Compiler inline zu haben ist ein Makro, aber Makros sind hier verpönt, da sich nicht typensicher sind und sich nicht so ohne weiteres in objektorientierte Konzepte einbinden lassen.

inline ist übrigends auch keine Funktion, sondern ein specifier (Stroustrup 7.1.1), also eine Art Attribut einer Funktion. Es gibt noch andere specifier, manche nur für Variablen (z.B. register), manche nur für Funktionen (z.B. inline) und manche für beides (z.B. static).
Einige specifier sind mittlerweise uninteressant, da die Compiler sie "nicht ernst nehmen", sie also von den meisten Compilern ignoriert werden.

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche