grundsätzliche Herangehensweise

foxxx

Mitglied
Klassenkonstrukt

Hallo,

ich soll innerhalb meines kleinen C++ Kurses nun eine Programmieraufgabe lösen in Borland und als Konsolenanwendung. Und zwar soll ich ein Programm zur Kontakte und Terminverwaltung schreiben, das objektorientiert aufgebaut ist und Vererbungsbeziehungen benutzt. Soweit krieg ich das mit Hilfe des Skriptes denk ich auch noch hin. Aber ich hätt da noch ein paar grundsätzliche Fragen.

Und zwar sollen folgende Dialogfunktionen enthalten sein:
- Anlegen eines Kontakts
- Anlegen eines Termins zu einem Kontakt
- Löschen einer Kontakts oder Termins
- Suchen eines Kontakts oder Termins
- Auflistung aller Kontakte mit Terminen

Nun stellt sich mir schon mal die Frage wie ich die Termine am besten den Kontakten zuordne. Ich dachte mir eine Klasse zu erstellen und dann ein Objekt "Kontaktx" für jeden Kontakt und ein Objekt "Terminx" für jeden Termin. Aber wie funktioniert dann die Zuordnung?

Hoffe ihr könnt mir da ein wenig mit Rat zur Seite stehen. Zumal die zeitliche Anforderung auch recht knackig ist. Bis Freitag sollen wir fertig sein und irgendwie geht mir grad die Muffe wenn ich daran denke...

Viele Grüße

f0x
 
Zuletzt bearbeitet:
Ich denke, am Besten erstellst Du eine Klasse 'Kontakt', weilche die Adressdaten eines Kontaktes enthält und eine klasse 'Termin', welche die Termindaten (Datum, Zeit, Beschreibung) sowie einen Zeiger auf ein Objekt der 'Kontakt'-Klasse enthält. Dann erstellst Du in Deinem Programm 2 Listen, eine für die Kontakte und eine für die Termine. Beim anlegen eines neuen Termins bietest Du dem Benutzer die Liste der Kontakte an, aus der er sich den entsprechenden Kontakt aussuchen kann. Hat er das getan, kannst Du dem Zeiger in der 'Termin'-Klasse die Adresse des gewählten 'Kontakt'-Objektes zuweisen. Das solltest Du bis Freitag locker schaffen.
 
Hallo Jokey,

vielen Dank für deine schnelle Antwort. Wir hatten bisher genau 2 Nachmittage C++ und sollen nun dieses Programm bewerkstelligen. Recht anspruchsvoll wie ich finde.

Ich denke ich habe das Klassenkonstrukt soweit. Könntest du es dir bitte einmal ansehen, ob das so passt?

Code:
class Kontakt
{
     public:
          char Kontakt_Vorname[];
          char Kontakt_Nachname[];
          char Kontakt_Strasse[];
          char Kontakt_Hausnummer[];
          char Kontakt_PLZ[];
          char Kontakt_Wohnort[];
          char Kontakt_Telefonnummer[];
          char Kontakt_Email[];
};


class PrivatKontakt : public Kontakt
{
     public:
          char PrivatKontakt_Geburtsdatum[];
          char PrivatKontakt_Geschlecht[];
          char PrivatKontakt_Vorlieben[];
};


class DienstKontakt : public Kontakt
{
     public:
          char DienstKontakt_Unternehmen[];
          char DienstKontakt_Branche[];
};


class Termin : public Kontakt
{
     public:
          char Termin_Datum[];
          char Termin_Uhrzeit[];
          char Termin_Anlass[];
};


Die Anforderungen sehen wie folgt aus:


Es gibt zwei Arten von Kontakten – private und dienstliche. Bei beiden Arten sollen folgende Daten gespeichert werden:

• Name (Vor- und Nachname)
• Anschrift (Straße Hausnummer, PLZ und Ort),
• Telefonnummer
• Email

• bei dienstlichen Adressen zusätzlich der
o Name des zugehörige Unternehmen
o Art des zugehörigen Unternehmens

• Bei privaten Adressen zusätzlich:
o das Geburtsdatum der Person
o das Geschlecht
o besondere Vorlieben (z.B. spielt Tennis)

Zu jedem Kontakt sind zudem Termine mit folgenden Angaben zu pflegen:
• Datum
• Uhrzeit
• Anschrift (s.o.)
• Anlass



Müsste das so passen? Was ich mir denke ist, daß es ja z.B. gar nicht nötig ist daß die Klasse Termin auch alle Eigenschaften außer der Anschrift erbt und daß man vieleicht nicht alles "public" deklarieren müsste. Aber da bin ich mir halt noch sehr unsicher.

Hoffe du (ihr) könnt mir da noch ein wenig weiterhelfen, damit ich das Dingens hinkrieg :)

Viele Grüße!
 
Im Prinzip schonmal ganz gut. Allerdings kannst Du keine uninitialisierten Arrays ohne Größenangabe erstellen. Sonst weiß der Comiler ja nicht, wieviel Speicher er dafgür reservieren soll. Also entwerder
Code:
char Vorname[] = "Peter"
was hier natürlich nicht sinnvoll ist, oder
Code:
char Vorname[256]
, was Dir eine maximale Länge des Vornamens von 255 Zeichen und der abschließenden 0 erlaubt. Du mußt allerdings darauf achten, daß Deine Einträge nie länger werden als das. Schöner wäre das ganze natürlich mit der STL - Klasse string. Da kannst Du dann variabler mit der Länge umgehen:
Code:
string Vorname;
Weiterhin kannst Du Dir eigentlich den Klassennamen bei den Membervariablen sparen, also nur 'Vorname' statt 'Kontakt_Vorname'.
Die Klasse 'Termin' brauchst Du nicht von 'Kontakt' ableiten.
Code:
class Termin
             {
                  public:
         	char Termin_Datum[20];
         	char Termin_Uhrzeit[20];
         	char Termin_Anlass[256];
    };
Da es die Aufgabenstellung so verlangt, müssen die Termine als Member eines Kontaktes implementiert sein (so würde ich das verstehen). Also braucht Deine Basisklasse 'Kontakt' noch eine Membervariable
Code:
Termin * pTermin;
Damit hast Du dann für jeden Kontakt genau einen Termin. Sollen es mehrere sein, dann solltest Du ein Array von Zeigern auf 'Termin' anlegen:
Code:
Termin * Terminliste[10]
So hättest Du z.B. 10 Termine pro Kontakt frei. Da man das natürlich beliebig komplex machen kann, könntest Du eine Liste von Terminen als Membervariable von 'Kontakt' anlegen, aber wir wollen es zu Beginn ja nicht übertreiben :-).
 
jokey2 hat gesagt.:
Die Klasse 'Termin' brauchst Du nicht von 'Kontakt' ableiten.
Code:
class Termin
             {
                  public:
         	char Termin_Datum[20];
         	char Termin_Uhrzeit[20];
         	char Termin_Anlass[256];
    };


Aber für Termin muß ich doch auch noch Strasse, Hausnummer, PLZ und Ort speichern. Und die Eigenschaften wollt ich halt von der Klasse Kontakt vererben. Wie könnte ich das sonst bei den Termindetails speichern?

Ich hab die zwei Tage weder was von Zeigern noch von Membervariablen oder sonst was gehört... ich hoffe ich krieg das noch hin.. Dieses Klassenkonstrukt aufbauen ist ja nur das eine. Nebenbei sollen wir ja auch noch die folgenden Funktionalitäten einbauen:

- Anlegen eines Kontakts
- Anlegen eines Termins zu einem Kontakt
- Löschen einer Kontakts oder Termins
- Suchen eines Kontakts oder Termins
- Auflistung aller Kontakte mit Terminen
 
Ich hab die zwei Tage weder was von Zeigern noch von Membervariablen oder sonst was gehört
Wie bitte Ihr sollt Klassen in C++ implementieren und habt noch nichts über Membervariablen gehört? Und dann sollt Ihr sowas programmieren? Das ist schon ganz schön hart!
Membervariablen nennt man die Variablen, die in einer Klasse deklariert sind. Sie können nur über das Objekt angesprochen werden. Z.B.:
Code:
Kontakt1.Vorname = "Peter" //wenn Vorname vom Typ 'string' ist
Aus Memberfunktionen (also Funktionen, die in der Klasse definiert sind) kann man sie direkt ansprechen, also ohne den Klassennamen. Von private, protected und public habt Ihr aber schon was gehört, oder?
Aber für Termin muß ich doch auch noch Strasse, Hausnummer, PLZ und Ort speichern.
Sorry, ich hatte die Beschreibung nicht so genau durchgelesen. So, wie ich das sehe, solltest Du eine Klasse 'Anschrift' schreiben, die Straße, Hausnummer, PLZ und Ort enthält. Davon leitest Du die Klassen 'Kontakt' und 'Termin' ab. Von der Klasse 'Kontakt' leitest Du, wie gehabt, die Klassen 'PrivatKontakt' und 'DienstKontakt' ab.
Habt Ihr schon gelernt, wie man Objekte mit 'new' erzeugt? Wie man im Konstruktor einer Klasse den Konstruktor der Basisklasse aufruft?
 
jokey2 hat gesagt.:
Wie bitte Ihr sollt Klassen in C++ implementieren und habt noch nichts über Membervariablen gehört? Und dann sollt Ihr sowas programmieren? Das ist schon ganz schön hart!

Ja, das ist wohl hart. Nach dem ersten Nachmittag sollten wir zwei kleine Programme machen. Das erste hat 5 Wurzeln berechnet, das zweite Sekunden in hh:mm:ss umgewandelt. Und nun sowas...


Von private, protected und public habt Ihr aber schon was gehört, oder?

Ja, da haben wir schon was gehört. Aber halt nur kurz den theoretischen Sachverhalt Im Skript ist eine kleine Übersicht was die einzellnen Keywords für Zugriffseinschränkungen nach sich ziehen. Membervariablen hat er mal in einem kleinen Beispiel benutzt. Allerdings ohne zu sagen daß die so heißen. Hab das jetzt nur an deinem Beispiel wiedererkannt.


Eine Klasse "Anschrift" werd ich dann jetzt noch anlegenm danke für den Hinweis.


Habt Ihr schon gelernt, wie man Objekte mit 'new' erzeugt? Wie man im Konstruktor einer Klasse den Konstruktor der Basisklasse aufruft?

Nein, mit "new" haben wir noch nichts erzeugt. Wir haben mit "[Klasse] [Test]" ein Objekt "Test" der Klasse "Klasse" erzeugt. Anders nicht und auch das nur 2 mal.

Ja irgendwie fühl ich mich wirklich gerade ein wenig überfordert. Das schlimme ist, das ganze geht zu 2/3 als Note in das Fach ein. Oh mein Gott... mir wird ganz anders..
 
Nein, mit "new" haben wir noch nichts erzeugt
Schade eigentlich, ich weiß nämlich nicht, wie man das ohne new lösen sollte. Da Du verschiedene Typen von Kontakten hast, mußt Du diese dynamisch erzeugen. Dürft Ihr Sachen verwenden, die im Unterricht noch nicht drankamen?
 
Ich glaube sowieso daß die Aufgabe ohne eine Menge Sachen die nicht besprochen wurden nicht lösbar ist. Er hat ausdrücklich gemeint wir "müssen nicht so tun als hätten wir noch nie programmiert". Dürfen also auch Dinge verwenden die nicht besprochen wurden. Allerdings sagte er daß es "statische Programmierung" ist was wir machen und damit auch machbar wäre !? Aber wie?
 
Zurück