• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

Hilfe bei Schulprogramm (C++)

Christian_1

Spiele-Novize/Novizin
Mitglied seit
22.03.2001
Beiträge
104
Reaktionspunkte
0
Hallo,
wir sollen ein Programm mit Vererbung erstellen. Und es soll eine Klasse Mitarbeiter geben die die Klassen Arbeiter und Angestellter unter sich hat.
Ich wollte es so machen, das man Namen und Bruttolohn vom Angestellten eingibt (per Hand) und wieder ausgibt. Bei Arbeiter gibt man Namen Stunden und Lohn ein und gibt es wieder aus. Eigentlich ein simples Programm nur steh ich mit C++ irgendwie auf Kriegsfuß!
Hab mal was eingetipt, bisher 20 Fehlermeldungen:

#include <stdio.h>
#include <iostream.h>
#include <conio.h>

string name, vorname;
double brutto;
int stunden, stundenlohn;


class cMitarbeiter
{
private:
string n ;
string vn;

public:
cMitarbeiter ();

string zeign ();
string zeigvn();

};


class cAngestellter: public cMitarbeiter
{
private:
b;

public:
cAngestellter ();

// void schreibbrutto();
double zeigbrutto();

};

class cArbeiter: public cMitarbeiter

{
private:
int std;
int stdl;

public:
int zeigstunden();
int zeigstundenlohn();
double zeigbrutto();
// void schreibstunden();
// void schreibstundenlohn();

} ;


//---------------Klasse Mitarbeiter-------------------------------


cMitarbeiter::cMitarbeiter()
{
}

string cMitarbeiter::zeign()
{
return n ;
}

string cMitarbeiter::zeigvn()
{
return vn ;
}


//---------------Klasse Angestelter-------------------------------



cAngestellter::cAngestellter (string, string, double)
{
cout<< "Geben Sie den ANG Namen ein: ";
cin >> name;
n = name ;

cout<< "Geben Sie den ANG Vornamen ein: ";
cin >> vorname;
vn = vorname;

cout<< "Geben Sie den ANG Bruttolohn ein: ";
cin >> brutto;
b = brutto;
}

double cAngestellter::zeigbrutto()
{
return b;
}


//---------------Klasse Arbeiter-------------------------------


cArbeiter::cArbeiter (string, string, int, int)
{
cout<< "Geben Sie den ARB Namen ein: ";
cin >> name;
n = name ;

cout<< "Geben Sie den ARB Vornamen ein: ";
cin >> vorname;
vn = vorname;

cout<< "Geben Sie den ARB Stundenlohn ein: ";
cin >> stundenlohn;
stdl = stundenlohn;

cout<< "Geben Sie die ARB Stunden ein: ";
cin >> stunden;
std = stunden;
}


double cArbeiter::zeigbrutto();
{
return (stunden*stundenlohn);
}

int cArbeiter::zeigstunden()
{
return std ;
}

int cArbeiter::zeigstundenlohn()
{
return stdl ;
}


//---------------Main-------------------------------


int main()

{
cAngestellter Daten ;
cArbeiter Daten1;

cout<< "\n\n\nANG Name: "<<Daten.zeign()<<"\n\nANGVorname: "<<Daten.zeigvn()<<"\n\nANGBrutto: "<<Daten.zeigbrutto();

cout<< "\n\n\nARB Name: "<<Daten1.zeign()<<"\n\nARBVorname: "<<Daten1.zeigvn()<<"\n\nARB Stunden: "<<Daten1.zeigstunden()<<"\n\nARB Stundenlohn: "<<Daten1.zeigstundenlohn()<<"\n\nARBBrutto: "<<Daten1.zeigbrutto();


getchar();
return 0;

}
 
Hab das noch nicht gelesen, aber
nur so als Tip:
Man schreibt nicht gleich das ganze Programm und merkt dann, dass es nicht geht, sondern fängt mit den einfachsten Funktionen an und arbeitet sich dann hoch und testet einzelne Funktionen.
 
So, ich hab mir das jetzt mal ein wenig angeschaut, und muss an sich sagen das da an sich einiges im Argen liegt ... =)

Theoretisch könnte ich dir einfach ein richtiges Programm hinklatschen, aber ich erkläre erst mal die Fehler die ich gefunden habe.

#include <stdio.h>
#include <iostream.h>
#include <conio.h>

Du arbeitest mit Strings, jedoch bindest du den String Header net ein. Jedoch kenn ich die conio.h net. Kann sein das es drinne steht, aber mein Compiler meldet weniger Fehler wenn ich noch #include <strings> mit rein schreib. Evtl. brauchst du dann noch using namespace std;, da bin ich mir nicht mehr sicher. Ich habs rein, aber ich brauche das auch schon für den iostream.

string name, vorname;
double brutto;
int stunden, stundenlohn;

Hier deklarierst du ein paar globale Variablen. Naja, nix schlimmes an sich, aber angewöhnen sollte man sich das auch nicht. Naja, wollte ich nur mal anmerken. So wie tu den code geschrieben hast brauchst du die zwar, aber nur weil das etwas umständlich gelöst ist.

class cAngestellter: public cMitarbeiter
{
private:
b; ...

Bis hier hin mal. Du sagst das deine Klasse ein private Feld haben soll welches b heißt. Jedoch hast du keinen Typ angegeben. Ohne funktionierts net so wirklich, deswegen einfach mal ein double b; draus machen, damit der compiler weiß, wieviel Speicher er reservieren muss.


cAngestellter::cAngestellter (string, string, double)
{
cout<< "Geben Sie den ANG Namen ein: ";
cin >> name;
n = name ; ...

Spricht an sich nix dagegen, nur meine Frage ist, warum speicherst du den Namen erst in ner Variablen uns weist dann der Klassenvariable den selben Wert zu? Mit cin >> n; sollte das auch gehn. Sicher geht deine Art auch, aber es ist halt mehr Aufwand. Beim cArbeiter Zeugs übrigens das selbe.



double cArbeiter::zeigbrutto();
{
return (stunden*stundenlohn);
}

Hier einfach das fette ";" , da der Compiler sonst den nachstehenden Code nicht zur Funktion gehörend definiert und deswegen nen Fehler raushaut.

Soo.. nun mal zu deiner Main Funktion.
du versuchst cArbeiter und cAngestellte zu initialisieren, was auch funktioniert. Jedoch werde in deinem Fall keine Werte zugewiesen. Du hast zwar für jede der Klassen einen Konstruktor geschrieben, jedoch da anscheinend irgendwie den Hund reingebracht. Folgendes:

a)
cArbeiter::cArbeiter (string, string, int, int)
Das funktioniert nicht.. wenn man schon sagt das man was übergeben will muss man auch noch Variablennamen vergeben, also z.B.
cArbeiter::cArbeiter (string VorName, string NachName, int Stundenlohn, int Stunden)

b) du initialisierst deine Klasse folgendermaßen:
cAngestellter Daten ;
Hier wird einfach ein Standartkonstruktor eingebunden der nix extra macht. Wenn du deinen eigenen aufrufen willst musst du Daten in etwa wie folgt initialisieren:cAngestellter Daten("NAME", "VORNAME", 2500);
Der Konstruktor wird aufgerufen und evtl. die Werte zugewiesen.

c) Wofür übergibst du Parameter an deinen Konstruktor wenn du die eh nicht brauchst? Entweder ganz ohne Parameter und dann, wie bei dir im Beispiel mit cin einlesen, oder halt mit Parameter und den entspechenden Wert zuweisen.


Soo.. ich denke mal das war einiges. Wenn du noch Fragen hast dann einfach hier rein schreiben. Normalerweise wird sich schon einer deiner an nehmen.

Btw. wenn jemand merkt/meint das ich hier nen rechten Schmarrn geschrieben habe soll er das bitte anmerken und richtigstellen, sonst werden andere Leute noch auf falsche Gedanken gebracht :-D
Außerdem kann jeder mal Fehler machen
 
So hab jetzt mal einiges geändert und komme jetzt noch auf drei Fehler:

1) declaration terminated incorrectly
2) 'cArbeiter::zeigstunden()' is not a member of 'carbeiter'
3) 'zeigstunden' is not a member of 'cArbeiter'

Quellcode:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <cstring.h>


string name, vorname;
double brutto;
int stunden, stundenlohn;


class cMitarbeiter
{
private:
string n ;
string vn;

public:
cMitarbeiter ();

string zeign ();
string zeigvn();

};


class cAngestellter: public cMitarbeiter
{
private:
double b;

public:
cAngestellter ();

// void schreibbrutto();
double zeigbrutto();

};

class cArbeiter: public cMitarbeiter

{
private:
int std;
int stdl;

public:
cArbeiter()

int zeigstunden();
int zeigstundenlohn();
double zeigbrutto();
// void schreibstunden();
// void schreibstundenlohn();

} ;


//---------------Klasse Mitarbeiter-------------------------------


cMitarbeiter::cMitarbeiter()
{
}

string cMitarbeiter::zeign()
{
return n ;
}

string cMitarbeiter::zeigvn()
{
return vn ;
}


//---------------Klasse Angestelter-------------------------------



cAngestellter::cAngestellter ()
{
cout<< "Geben Sie den ANG Namen ein: ";
cin >> name;
//n = name ;

cout<< "Geben Sie den ANG Vornamen ein: ";
cin >> vorname;
//vn = vorname;

cout<< "Geben Sie den ANG Bruttolohn ein: ";
cin >> brutto;
//b = brutto;
}

double cAngestellter::zeigbrutto()
{
return b;
}


//---------------Klasse Arbeiter-------------------------------


cArbeiter::cArbeiter ()
{
cout<< "Geben Sie den ARB Namen ein: ";
cin >> name;
//n = name ;

cout<< "Geben Sie den ARB Vornamen ein: ";
cin >> vorname;
//vn = vorname;

cout<< "Geben Sie den ARB Stundenlohn ein: ";
cin >> stundenlohn;
//stdl = stundenlohn;

cout<< "Geben Sie die ARB Stunden ein: ";
cin >> stunden;
//std = stunden;
}


double cArbeiter::zeigbrutto()
{
return (stunden*stundenlohn);
}

int cArbeiter::zeigstunden()
{
return std ;
}

int cArbeiter::zeigstundenlohn()
{
return stdl ;
}


//---------------Main-------------------------------


int main()

{
cAngestellter Daten ;
cArbeiter Daten1;

cout<< "\n\n\nANG Name: "<<Daten.zeign()<<"\n\nANGVorname: "<<Daten.zeigvn()<<"\n\nANGBrutto: "<<Daten.zeigbrutto();

cout<< "\n\n\nARB Name: "<<Daten1.zeign()<<"\n\nARBVorname: "<<Daten1.zeigvn()<<"\n\nARB Stunden: "<<Daten1.zeigstunden()<<"\n\nARB Stundenlohn: "<<Daten1.zeigstundenlohn()<<"\n\nARBBrutto: "<<Daten1.zeigbrutto();


getchar();
return 0;

}
 
Christian_1 am 24.02.2005 20:26 schrieb:
So hab jetzt mal einiges geändert und komme jetzt noch auf drei Fehler:

bla

Also wenn ich deinen Code bei mir in den Compiler werfe und ein bissi ändere ist er zumindest ausführbar.. Nur mit den Werten hauts noch nicht so ganz hin.

(was ich bei mir gemacht habe ist cstring in string, nen namespace rein und irgendwo hast du in dem code hier noch nen ; vergessen)
 
Also wenn ich deinen Code bei mir in den Compiler werfe und ein bissi ändere ist er zumindest ausführbar.. Nur mit den Werten hauts noch nicht so ganz hin.

(was ich bei mir gemacht habe ist cstring in string, nen namespace rein und irgendwo hast du in dem code hier noch nen ; vergessen)
[/quote]

Also du hast <cstring.h>
in <string.h> geändert!?!

Was ist ein Namespace?
Kannst du vielleicht genau sagen was du geändert hast?
Danke an alle erst mal für die Hilfe!

MfG
Christian
 
Christian_1 am 24.02.2005 21:05 schrieb:
Kannst du vielleicht genau sagen was du geändert hast?


ich war mal so frei und habe das Programm so angepasst das es (bei mir) funktioniert. Die Main.cpp bekommst du hier:
http://rapidshare.de/files/696832/main.cpp.html
(irgendwie auf free klicken und dann auf der nächsten Seite unten auf Main.cpp)

Sollte eigentlich funktionieren, wenn nicht einfach als Referenz benutzen und nachschaun was anders ist und so auf Fehlerquellen schließen. Wie gesagt, bei mir tuts ;)
Außerdem habe ich eigentlich eh nur Zeugs geändert das ich oben schon angesprochen habe.
MfG

Btw, darf ich mal fragen was du für einen Compiler benutzt?
 
Weis nicht was du genau meinst mit Compiler, ich hab das Programm mit dem Borland C++ Builder programmiert!
Ich hab echt kaum Ahnung von C++ und am 18.3 ist Abi Prüfung!
Meine Hoffnung basiert immer noch darauf das der Vorschlag mit VB genommen wird, davon habe ich wenigstens ein bisschen Ahnung, auf jeden Fall bringe ich dort die Programme zum laufen!

Ich werde mir morgen mal den Code anschauen habe heute keine Geduld mehr und nochmals vielen Dank ohne dich wäre ich echt aufgeschmissen gewesen!

MfG
Christian
 
Zum den globalen variablen:

Da du schon Klassen verwendest solltest du keine globalen vars verwenden, da dies nicht wirklich c++ konform ist, man kann natuerlich aber das ist nicht der grundgedanke von objekt orientierter programmierung daher sind diese zu vermeiden
 
Zurück