Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klassen-kampf!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
21.01.2004, 19:41 Uhr
Tommi Bisic



Hallo
Ich habe ein Problem und wäre für jede Hilfe dankbar
Ich versuche ein Programm mit einer Klasse zu erstellen wo man den Namen,das Alter, das Gehalt und die Jahre der Tätigkeit eines Mitarbeiters eingeben kann.Mit den Daten für die Jahre,das Gehalt und dem Alter klappt das auch, nur mit der Eingabe des Names habe ich meine Probleme.
Das Programm sieht wie folgt aus:

C++:
#include <iostream.h>

class Employee
{
public:
    int GetAge();
    void SetAge(int age);
    int GetYearsOfService();
    void SetYearsOfService(int year);
    int GetSalary();
    void SetSalary(int salary);
    char GetName();
    void SetName(char name);
private:
    int itsAge;
    int itsYears;
    int itsSalary;
    char itsName;
};
char Employee::GetName()
{
    return itsName;
}
void Employee::SetName( char name)
{
    cout<<"Name:"<<endl;
    cin>>name;
             itsName=name;
}
int Employee::GetAge()
{
    return itsAge;
}
void Employee::SetAge(int age)
{
    cout<<"Alter:"<<endl;
    cin>>age;
    itsAge=age;
}
int Employee::GetYearsOfService()
{
    return itsYears;
}
void Employee::SetYearsOfService(int years)
{    
    cout<<"Jahre:"<<endl;
    cin>>years;
    itsYears=years;
}
int Employee::GetSalary()
{
    return itsSalary;
}
void Employee::SetSalary(int salary)
{
    cout<<"Gehalt:"<<endl;
    cin>>salary;
    itsSalary=salary;
}

void main()
{
    Employee name;
    name.SetAge(23);
    name.SetSalary(80);
    name.SetYearsOfService(12);
    cout<<name.GetName()<<" ist ein Mitarbeiter der "<<name.GetAge()<<" Jahre alt ist";
    cout<<", \n"<<name.GetSalary()<<" Euro verdient";
    cout<<" und seit "<<name.GetYearsOfService()<<" Jahren dabei ist"<<endl;
    
}


Weiss jemand, was ich falsch mache??Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.01.2004, 19:58 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


char ist nur ein "Buchstabe"...
nimm std::string da kannst du problemlos einen namen drin speichern...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.01.2004, 20:00 Uhr
0xdeadbeef
Gott
(Operator)


Einfachste Methode wäre std::string:

C++:
#include <string>

std::string s;
std::getline(std::cin, s); // liest eine Zeile in s ein


char ist nur ein einzelner Buchstabe. Allerdings macht dieser Code so wenig Sinn, ich nehme an, dass das eher so gemeint war:

C++:
void Employee::SetAge(int age)
{
    itsAge=age;
}

//...

Employee e;
e.SetAge(22); //setzt das Alter des Angestelltenauf 22


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.01.2004, 20:01 Uhr
RedEagle



erstmal sollte aus
void main()


C++:
int main()
{
//...

return 0;
}



werden.


kann sein, das es vielleich an char name()
liegt, bin mir aber nicht sicher (habe keine Ahnung von Klassen aber das ist der einzigste unterschied zu den anderen Funktionen)
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.01.2004, 20:02 Uhr
RedEagle



Da habe ich mit dem char ja garnicht so falsch gelegen
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.01.2004, 20:12 Uhr
Tommi Bisic



Danke für die Antworten leider weiss ich nur nicht wie ich diesen String benutze...Ich kenne ihn bis jetzt nicht.Könnte mir das vielleicht jemand ein wenig genauer erklären und -falls möglich- ihn in den Teil meines Programmes einbauen wo er auch hingehört.Das wäre nett.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.01.2004, 20:35 Uhr
0xdeadbeef
Gott
(Operator)


Au weia. Naja, vielleicht sollten wir erstmal mit C-Strings anfangen, damit du die Basics draufkriegst. Also: Ein char ist ein einzelner Buchstabe (ein einzelnes ASCII-Zeichen, um genau zu sein). Zum Beispiel:

C++:
#include <stdio.h>

int main() {
  char zeichen = 'A';
  putchar(zeichen);

  return 0;
}


wird ein A auf dem Bildschirm ausgeben. Ein String ist eine Zeichenkette, also mehrere Zeichen hintereinander. In C macht man das normalerweise als Array von Zeichen, also:

C++:
#include <stdio.h>

int main() {
  char s[6];
  s[0] = 'H';
  s[1] = 'e';
  s[2] = 'l';
  s[3] = 'l';
  s[4] = 'o';
  s[5] = 0;

  puts(s);

  return 0;
}


Das Null-Zeichen am Ende des Strings ist notwendig, damit Funktionen, die nachher mit dem String arbeiten, wissen, wann er zu Ende ist. Man nennt es auch einen Sentinel oder Terminator. Natürlich ist diese Art der Notation ziemlich umständlich, aber sie zeigt, wie der String aufgebaut ist. Im echten Leben würdest du das etwa so schreiben:

C++:
#include <stdio.h>

int main() {
  char s[6];
  strcpy(s, "Hello");
  puts(s);

  return 0;
}


oder auch:

C++:
#include <stdio.h>

int main() {
  char s[] = "Hello";
  puts(s);

  return 0;
}


oder, ganz einfach:

C++:
#include <stdio.h>

int main() {
  puts("Hello");

  return 0;
}


Ein Problem, das sich daraus ergibt, ist natürlich, dass man immer einen Speicherbereich fester Länge anfordert. Wenn man sich nicht sicher sein kann, wie viel Input man eigentlich kriegt, kann das zu Buffer Overflows führen - wenn man nicht vorsichtig ist. Nimm Zum Beispiel das hier:

C++:
#include <stdio.h>

int main() {
  char s[5];
  strcpy(s, "Hello");
  puts(s);
  return 0;
}


"Hello" sieht zwar aus wie ein fünf Byte langer string, aber wegen des Sentinels ist er eigentlich sechs byte lang. Noch fieser ist sowas:

C++:
#include <stdio.h>

int main() {
  char zeile[20];
  gets(zeile);
  puts(zeile);
  return 0;
}


Wenn der Benutzer mehr als zwanzig Zeiten eingibt, gibt es einen Buffer Overflow. Ist das soweit klar?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.01.2004, 20:55 Uhr
Tommi Bisic



Danke für deine ausfuhrliche Antwort
Eigentlich wollte ich aber wissen was ich wo in meinem Quellcode ändern muss,dass das Programm läuft.Trotzdem hat deine Erklärung einige Lücken bei mir gestopft.Dafür nochmals Danke
Zusätzlich habe ich noch eine Frage.

C++:
name.SetAge(20);


Warum muss in der Klammer ein Wert stehen wenn ich den Befehl gegeben habe, dass was man eintippt zu übernehmen

C++:
int Employee::GetAge()
{
    return itsAge;
}
void Employee::SetAge(int age)
{
    cout<<"Alter:"<<endl;
    cin>>age;
    itsAge=age;


Wenn ich den Wert aus der Klammer streiche meldet sich mein Compiler
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.01.2004, 21:11 Uhr
0xdeadbeef
Gott
(Operator)


Es ist wichtig, dass du das verstehst. Nicht nur, dass dieses eine Programm läuft. Also weiter im Text - das Problem mit den Buffer Overflows kann unter Umständen verdammt nervig werden. Durch Programmierfehler kann der Kram unsicher werden, bei dynamischer Alloziierung besteht die Gefahr von Speicherlecks, dir können Reste im Input-Stream bleiben - solche Dinge. Im Grunde nicht schwer, aber ziemlich aufwändig zu umgehen, und das führt leicht zu Programmierfehlern. An der Stelle kommt bei C++ std::string ins Spiel. std::string ist eine Klasse aus der STL, die einen String darstellt und das gesamte Speichermanagement für dich übernimmt. Das geht zwar ein bisschen auf die Performance, aber der Gewinn an Stabilität, Sicherheit und Einfachheit macht das mehr als wett. Zum Beispiel kannst du in C++ gefahrlos

C++:
std::string s;
std::cin >> s;


machen, ohne dich um den angeforderten Speicher zu kümmern - wenn der zu Ende geht, fordert std::string selbstständig neuen an. OOP hooray! Im Grunde wendest du das Ding ganz intuitiv an - ähnlich wie Basistypen. Zum Beispiel:

C++:
std::string s = "Hello";
std::string t = "World!";
s += " funky ";
s = s + t;
std::cout << s << std::endl;


In C++ gibt es die Möglichkeit, Operatoren zu überladen. Das bedeutet, dass Operatoren wie + als Funktionen auffasst, in denen man alles mögliche machen kann. Naja, bei std::string wurde das so eingerichtet, dass zwei Strings aneinander gehängt werden. Das macht die Anwendung sehr intuitiv.

So weit klar? Frag ruhig, wenn du Fragen hast. Ich weiß, dass das nicht ganz trivial ist.

Was die Parameterfrage angeht - du forderst einen Parameter an. Indem du in der Klassendeklaration

C++:
  void setAge(int);


deklarierst, erklärst du, dass setAge einen int als Parameter erwartet. Ich frage mich sowieso ein bisschen, was dieses Design bringen soll...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 21.01.2004 um 21:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.01.2004, 22:02 Uhr
Tommi Bisic



Also wegen dem design: das was ich hier gemacht habe ist eine Aufg. aus einem Buch. bei dieser Aufg. gab es keine Eingaben(cin).Diese Aufg. habe ich selbst mit eingaben erweitert (Ich denke durch ausprobieren lernt man am schnellsten).Leider hat es nicht ganz geklappt Ich kann das Alter, die Jahre etc eingeben nur mit dem Namen klappt das nicht.Diesbezüglich war eigentlich auch meine Frage.Verstehe mich bitte nicht falsch das was du mir gerade erklärt hast war mehr als hilfreich nur ich bin im 1 Sem. und kenne diesen
std::string s befehl nicht deswegen dann auch die Frage wo ich ihn bei mir einsetzen muss.Du würdest mir also einen riesen Gefallen tun wenn du dir die Zeit nehmen könntest mein "Werk" mal durchzuschauen und mir zu sagen wo ich was besser machen muss und bezüglich den Parametern...Wenn ich das Programm laufen lasse(ohne namen) kann ich alles eintippen(alter,etc) aber wenn ich nichts eintippe gibt er mir den Wert aus der Klammer aus.Warum??
Ich hoffe ich nerve nicht schon mit meiner Fragerei aber ich stehe ein wenig unter Stress(Prüfung in Info. am Fr.)und diese Klassen bekomme ich einfach nicht auf die Reihe(vor allem mit private und public)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: