[C++] Code, brauche hilfe

N

Nebulus Jones

Gast
C++ Code, brauche hilfe

Hallo Programmierer!

Ich habe von der Schule aus eine Aufgabe zu Hause gelöst, bin mir aber nicht sicher, ob ic das alles so richtig geschrieben habe. Da ich keinen C Compiler besitze brauche ich eure Hilfe.
Könnte ihr mir die Fehler, die in diesem Code enthalten sind sagen?
Oder eine Adresse, wo ich einen Compiler herbekomme. Dann kann ich selbst die Fehler beseitigen. Danke schonmal im Vorraus!
Für Tipps wäre ich dankbar (um die Struktur zu verbessern z.B.)!

Code:
#include<iostream.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#include<stdio.h>

class adressen
{

	protected: 
			char name[10];
			char strasse[20];
			char ort[20];
			char telefon[15];
			char telefax[15];
			char email[20];
	virtual:
		virtual void adr_ein();
		virtual void adr_zeig();
};
class adressen adressdaten[10];

class kunden : public adressen
{
	
	protected:
			char kd_nummer[5];
			float umsatz;
	public:
			void adr_ein();
			void adr_zeig();
};
class kunden kd_daten[10];

class lieferer : public adressen
{
	
	protected:
			char lief_bank[15];
			char lief_konto[8];
			char lief_blz[8];
	public:	
			void adr_ein();
			void adr_zeig();
};
class lieferer lieferanten[10];

void adressen : adr_ein()
{
	cout <<"Bitte geben sie keine Leerzeichen ein!";
	cout <<"\nBitte geben sie den Namen ein: "; cin >> name;
	cout <<"\nBitte geben sie die Strasse ein: "; cin >> strasse;
	cout <<"\nBitte geben sie den Ort an: "; cin >> ort;
	cout <<"\nBitte geben sie die Telefonnummer an: "; cin >> telefon;
	cout <<"\nBitte geben sie die Telefaxnummer an: "; cin >> telefax;
	cout <<"\nBitte geben sie die emailadresse ein: "; cin >> email;
}

void kunden : adr_ein()
{
	adressen :: adr_ein();
	cout <<"Bitte geben sie die Kundennummer ein: "; cin >> kd_nummer;
	cout <<"Bitte geben sie den Umsatz des letzten Jahres ein: "; cin >> umsatz;
}

void lieferer : adr_ein()
{
	adressen :: adr_ein();
	cout <<"Bitte geben sie die Lieferer Bank ein: "; cin >> lief_bank;
	cout <<"Bitte geben sie die Lieferer KontoNr ein: "; cin >> lief_konto;
	cout <<"Bitte geben sie die Bankleitzahl ein: "; cin >> lief_blz;
}

void main(void)
{
int index;
int wahl;
cout <<"Bitte Wählen sie den gewünschten Menüpunkt: ";
cout <<"\n1. Kundendaten eingeben\n2. Liefererdaten eingeben\n3. Kundendaten anzeigen\n 4. Liefererdaten anzeigen";
cout <<"Ihre Auswahl: "; cin >> wahl;

switch(wahl)
{

	case 1:
	cout <<"Welchen Datensatz möchten sie eingeben: "; cin >> index;
	kd_daten[index].adr_ein();
	break;
	
	case 2:
	cout <<"Welchen Datensatz möchten sie eingeben: "; cin >> index;
	lieferanten[index].adr_ein();
	break;

	case 3:
	cout <<"Welcher Datensatz soll angezeigt werden? "; cin >> index;
	kunden[index].adr_zeig();
	break;

	case 4:
	cout <<"Welcher Datensatz soll angezeigt werden? "; cin >> index;
	lieferanten[index].adr_zeig();
	break;
}
}
 
Hallo.

Hab mal ein bisschen drübergeguckt. Hier was mir aufgefallen ist:

- Warum deklarierst du die Membermethoden adr_ein() und adr_zeig() in class adressen als virtuell ? Da du auch von dieser Klasse Instanzen erzeugst und diese Methoden auch implementierst ist das nicht nötig. Besser noch es ist eigentlich falsch. Mach einfach das virtual weg (beide !!) und mach sie public. Dann können die trotzdem noch beim Vererben überladen werden.

-
Code:
class adressen adressdaten[10];
das geht nur, wenn du keine Methoden als virtual deklariert hast. Das class kann weggelassen werden. Das sollte am besten hinter die Definition der ganzen Methoden.

- das selbe hier:
Code:
class kunden kd_daten[10];

- bei den Definitionen fehlt überall das adr_zeig() das muss natürlich auch implementiert werden. Sonst meckert der Linker.

- gegen ende hast du anstatt kd_daten[index].... kunden[index] geschrieben.

C++ Compiler gibt es ein paar. Probier doch mal die gcc (Gnu Compiler Collection). Die ist kostenlos und gibt es für viele Betriebssysteme. Hab grad keinen Link.. Aber das solltest du finden können.
 
Zuletzt bearbeitet:
Unser Thema lautet Polymorphie, deswegen das mit dem virtual.

Den Compiler werde ich mir gleich mal runterladen.
Vielen Dank erstmal für deine Hilfe *freu* :)

Die anderen Fehler hab ich behoben Danke !
 
virtual wird verwendet um z.B. abstrakte Klassen zu deklarieren. (Klassen, von denen nie ein Objekt erzeugt wird)

Polymorphie ist aus meinem Verständnis heraus schon das überladen von Methoden.
(semantisch die selbe Nachricht an ein Objekt, andere ausgeführte Funktion)
 
Zuletzt bearbeitet:
Ich hab das nicht ganz verstanden, deswegen schreibe ich mal, was meiner Meinung nach der Sinn bei diesem Programm ist, mit virtual zu arbeiten:

Also Adressen ist ja die Basisklasse.
Adressen :: adr_ein()
führt folgende Aktion aus:

Code:
cout <<"\nBitte geben sie den Namen ein: "; cin >> name;
	cout <<"\nBitte geben sie die Strasse ein: "; cin >> strasse;
	cout <<"\nBitte geben sie den Ort an: "; cin >> ort;
	cout <<"\nBitte geben sie die Telefonnummer an: "; cin >> telefon;
	cout <<"\nBitte geben sie die Telefaxnummer an: "; cin >> telefax;
	cout <<"\nBitte geben sie die emailadresse ein: "; cin >> email;

Damit man das nicht ständig neu eintippen muss, wird es virtual deklariert und man kann es mit dem Befehl adressen :: adr_ein()
in jeder Klasse verwenden.

Und Polymorphie bedeutet doch vielseitikeit, dass z.B. alle Objekte (und Methoden ?!) der Basisklasse in anderen Klassen verwendet werden können, oder hab ich da was falsch verstanden?
 
Dazu muss es nicht virtual sein. Du kannst die Funktionen einer Oberklasse immer aufrufen.

Virtual benutzt man bei Funktionen, die man hier noch nicht definieren will(man gibt keinen Code an, sondern nur den Rumpf). Erst abgeleitetet Klassen werden die Methoden definieren.

:cool_alt:
Polymorphie:
die Methoden stellen praktisch Nachrichten an Objekte dar.
Du sagst bei dir einem Adressen-Objekt adr_zeig().
Einem abgeleiteten Objekt z.B. Kunden sagst du auch adr_zeig(). Dieses inetrpretiert die Nachricht aber anders (anderer Methoden-Code). Also die semantisch selbe Nachricht löst unetrschiedliche Sachen aus, je nachdem, wie die Methode implementiert ist( das erreicht man duch überschreiben einer Methode)

Übrigens mal zum Stil: ;)
Klassennamen werden immer gross geschrieben. Das kannst du dir schon mal angewöhnen.
Ausserdem verwendet man normalerweise für eine Klasse eine eigene .h und eine eigene .cpp Datei, die die .h Datei includiert. in der .h datei stehen die Deklarationen, in der .cpp Datei die Definitionen der Methoden...
 
*g*

Jetzt geht mir allmälich ein Licht auf.
Habe wohl einige Begriffe etwas durcheinandergeworfen :)

Hab erstmal vielen Dank, hätte nicht mit so professioneller Hilfe gerechnet, hmmm eigentlich doch is ja Forumbase :D

Besten Dank!

Ciaoi

PS: Das mit der eigenen Header is bei uns so ein Problem. Wir sitzen seltenst am selben Rechner, wenn wir Unterricht haben, deswegen is das immer nen bisschen blöd, für jedes Programm eine eigene h Datei zu erstellen. Es dauert ja doch länger (Bei Amateuren) als 90 Min für ein Prog.
 
Zurück
Oben