Probleme mit Klassen / meine erste Klasse......
-
Hallo habe vor kurzem mit Visul C++ 6.0 angefangen zu programmieren.
Bin beim Thema Klassen angekommen und weiß nu nicht mehr weiter....
Bei meinem Programm habe ich eine Klasse erstell die das alter als private
Variable hat und im public bereich steht ne Funktion, die logischerweise dieses alter aus private ändern kann/sollversuche die Funktion aus main() aufzurufen, so kann ich die variable im private bereich mithilfe der
funktion ausm public-bereich ändern... leider stimmt irgendwass nicht, nur was ??// Klassen in C++ #include <iostream.h> #include <cstring> class Klasse1 { private: int alter; public: int leseAlter(void) {return alter;} int speicherAlter(int); // Funktionsprototyp der auf (private)alter // zugreifen darf }; int Klasse1::speicherAlter(int) // Die Funktion speicherAlter aus Klasse1 { alt = alter; } int main() { int alt; cout << "Alter: "; cin >> alt; Klasse1::speicherAlter(alt); return 0; }
Danke im Vorraus,
Studi
-
Hallo
du must dem Parameter in
int speicherAlter(int);
einen Namen geben und diesen sinnvoll verwenden.
bis bald
akari
-
int Klasse1::speicherAlter(int wald) { alter = wald; }
-
Nee sorry
klappt noch nicht, was ist noch falsch ??// Klassen in C++ #include <iostream.h> #include <cstring> class Klasse1 { private: int alter; public: int leseAlter(void) {return alter;} int speicherAlter(int); // Funktionsprototyp der auf (private)alter // zugreifen darf }; int Klasse1::speicherAlter(int wald) // Die Funktion speicherAlter aus Klasse1 { alter = wald; } int main() { int wald; cout << "Alter: "; cin >> wald; Klasse1::speicherAlter(wald); return 0; }
DANKESCHÖN
-
speicherAlter muss nen Wert zurückgeben, zumindest VC++ bricht wegen sowas die Kompilierung ab.
-
volkard schrieb:
int Klasse1::speicherAlter(int wald) { alter = wald; }
Hat "wald" irgendne Bedeutung oder beziehst du dich auf
einen Namen geben und diesen sinnvoll verwenden.
#include <iostream> // neue header, niemals *.h! // cstring weggelassen, c-stringfunktionen werden nicht benötigt // tipp: nimm <string> anstelle class Klasse1 // foo gefällt mir besser :) { int alter; public: inline int leseAlter() const // inline (empfehlung) + const methode { return alter; } int speicherAlter(int); }; int Klasse1::speicherAlter(int wald) // schon wieder wald? :) { alter = wald; // wald ist modern return alter; // zurück geben } int main() { std::cout << "Alter: "; // std:: <- namensraum int wald; std::cin >> wald; // wald!! Klasse1 foo; // ist nicht static, daher erst ein object erstellen foo.speicherAlter(wald); // methode aufrufen }
alles klar nun?
-
ChrissiB schrieb:
Hat "wald" irgendne Bedeutung
nein. es durfte nur nicht alter oder alt heißen, damit man den übergabeparameter nicht mit einer anderen variablen verwechselt.
würde sie alter heißen. wäre der code alter=alter komisch. würde sie alt heißen, wäre nicht klar, wie es kommt, daß alt auß der main auf einmal alt in der funktion ist. nur um komplikationen vorzubeugen, wähle ich wald.
-
Mir kommt es vor, du bist nicht volkard. Ihh glaube zu meinen, volkard sagte mal, dass er nur angemeldet postet. Naja, mal sehen.. Bei Doppeldeutungen nehme ich das (Unterstrich):
int foo(int alter_) { alter = alter_; }
-
dann doch lieber:
void foo(int alter) { this->alter = alter; }
-
int Klasse1::speicherAlter(int wald) // schon wieder wald?
{
alter = wald; // wald ist modern
return alter; // zurück geben
}was soll denn das?
warum soll alter zurpckgegeben werden? soll man das irgendwie sinnvoll auswerten können?
entweder
void Klasse1::speicherAlter( unsigned alter )
oder [cpp] int Klasse1.... { return 0; // z.b. }
ich würd anders machen, sodass es etwas prof. ist.
// 1. die membervarialbe am besten so nennen unsigned int m_alter; dann als fkt bool speichereAlter( unsigned int _value ); // man kann als namen auch ruhig alter nehmen // warum ich immer _value nehme, weil es bei setterfkt nichts gibt was da missverstanden wäre // deswegen würd ich auch english schreiben bool setAge( unsigned int _value); // weiss nicht was man hier missverstehen sollte // in der fkt dann bool Klasse1::setAge( unsigned int _value) { m_age = _value; // hier english als membervariable auch nehmen return true; // das hat dir gefällt - Studiologe - "ein rückgabewert" }
inline würd ich nicht schreiben. muss nicht sein, da der compiler das eh optimieren muesste. aber ok, tipp ruhig mehr code ( wer nach count of codes bezahlt wird )
-
newkid_ schrieb:
int Klasse1::speicherAlter(int wald) // schon wieder wald?
{
alter = wald; // wald ist modern
return alter; // zurück geben
}was soll denn das?
warum soll alter zurpckgegeben werden? soll man das irgendwie sinnvoll auswerten können?
entweder
void Klasse1::speicherAlter( unsigned alter )
oder [cpp] int Klasse1.... { return 0; // z.b. }
Stimmt, beim Schreiben habe ich zu wenig gedacht und mir noch schnell den Post von mir davor durchgelesen. Dann nimmt man lieber void als Rückgabewert.
ich würd anders machen, sodass es etwas prof. ist.
// 1. die membervarialbe am besten so nennen unsigned int m_alter; // <- hm, m_ muss doch nicht sein, ich nehme es nicht! Man sieht doch eh immer, dass es ein Member ist. Doppeldeutigkeit bei aRgumente und Member haben die ARgumente ein _ nachgestellt, die Member heißen normal. Das ist ok so, und ich komme nich durcheinander dann als fkt bool speichereAlter( unsigned int _value ); // man kann als namen auch ruhig alter nehmen // <- jo, wäre besser sogar // warum ich immer _value nehme, weil es bei setterfkt nichts gibt was da missverstanden wäre // <- hmm, sind die _*-Namen nicht nur für die Compiler registriet laut Standard? // deswegen würd ich auch english schreiben bool setAge( unsigned int _value); // weiss nicht was man hier missverstehen sollte // <- englisch ist immer besser *g* // in der fkt dann bool Klasse1::setAge( unsigned int _value) { m_age = _value; // hier english als membervariable auch nehmen return true; // das hat dir gefällt - Studiologe - "ein rückgabewert" } // dann lieber doch void returnen, notfalls ne exception werfen, wobei: was soll hier passieren?
inline würd ich nicht schreiben. muss nicht sein, da der compiler das eh optimieren muesste. aber ok, tipp ruhig mehr code ( wer nach count of codes bezahlt wird )
Hehe. Naja, ich ergänze es halt gern, obwohl ich weiß, dass der Compiler das normalerweise selber weiß, dass er hier inlinen kann. Hier habe ich es auch geschrieben, damit es deutlich wird, was der Compiler anstellt.
-
ChrissiB schrieb:
Mir kommt es vor, du bist nicht volkard. Ihh glaube zu meinen, volkard sagte mal, dass er nur angemeldet postet. Naja, mal sehen..
heute mal, wegen der serverumstellung (ist doch heute?) vergisst er andauernd meine cookies.
-
volkard schrieb:
ChrissiB schrieb:
Mir kommt es vor, du bist nicht volkard. Ihh glaube zu meinen, volkard sagte mal, dass er nur angemeldet postet. Naja, mal sehen..
heute mal, wegen der serverumstellung (ist doch heute?) vergisst er andauernd meine cookies.
Achso, alles klar.
-
ChrissiB schrieb:
volkard schrieb:
ChrissiB schrieb:
Mir kommt es vor, du bist nicht volkard. Ihh glaube zu meinen, volkard sagte mal, dass er nur angemeldet postet. Naja, mal sehen..
heute mal, wegen der serverumstellung (ist doch heute?) vergisst er andauernd meine cookies.
Achso, alles klar.
immernoch. die haben wiedermal was kaputtgespielt.
-
Hallo,
habe das Programm von ChrissiB noch ein wenig abgeändert, das läuft jetzt super, Großes Dank an ChrissiB und allen anderen, die sich so stark bemühen....aber nun habe ich doch noch ein Paar Fragen:
-
wo genau liegt der Unterschied, ob ich nun cout oder std::cout nehme ???
für das cout wird #include <iostream.h> benötigt für std::cout
#include <iostream>
Wo liegt der Unterschied ? -
Habe das Programm um name erweitert, was aber noch nicht ganz klappt.
Verwende ich char name; ist alles OK keine Fehler/ Warnungen beim Compil.
jedoch wird dann nur der Erste Buchstabe vom eingegebenem Namen wieder
zurückgegeben.
Nehme ich aber anstelle von char name; char name[15] kommt es zu mehreren
Fehlern beim compil.#include <iostream.h> class Klasse1 { private: int alter; // Variablendeklaration alter char name; public: inline int leseAlter() const // inline (Empfehlung) + const methode { return alter; // Rückgabewert alter } inline char leseName() const // inline (Empfehlung) + const methode { return name; } int speicherAlter(int); // Funktionsprototyp char speicherName(char); // Funktionsprototyp }; int Klasse1::speicherAlter(int wald)// Funktion zum speichern von alter { alter = wald; // alter gleich übergebener Variable wald return alter; // Rückgabewert alter } char Klasse1::speicherName(char baum)// Funktion zum speichern von name { name = baum; // alter gleich übergebener Variable baum return name; // Rückgabewert alter } int main() { cout << "Alter: "; // Ausgeben int wald; // Variablendeklaration wald cin >> wald; // Einlesen Klasse1 foo; // ist nicht static, daher erst ein object erstellen foo.speicherAlter(wald); // methode aufrufen cout << foo.leseAlter() << "\n"; /*Ausgeben von object foo, der public Funktion leseAlter*/ cout << "Name: "; // Ausgeben char baum; // Variablendeklaration baum cin >> baum; // Einlesen Klasse1 joo; // ist nicht static, daher erst ein object erstellen joo.speicherName(baum); // methode aufrufen cout << joo.leseName() << "\n"; /*Ausgeben von object foo, der public Funktion leseName*/ return 0; }
Besten Dank für Eure Bemühungen
-
-
Also ein char speichert ja nur einen buchstaben
ein feld of char z.b. *c speichert mehr, aber um wie und wo ect. willst du dich nicht wirklich kümmern
deswegen mach es wie alle
nimm string
std::string name;
da haste dann auch sehr viele methoden dafuer um bestimme sachen zu suchenz.b. string s1 = "hallo du Heinz wie gehts?";
und dann kannste nach "Heinz" suchen ect.
-
Ach ja da wäre doch noch ne klitzekleine Kleinigkeit...
was hat es denn mit
inline int leseAlter() const // inline (Empfehlung) + const methode
der Inline-Methode auf sich und was mit const
also Unterschied zwischeninline int leseAlter() const // und int leseAlter()
THX
-
inline für compiler google mal. brauchst du aber nicht, da der compiler imho sowieso entscheidet ob er was inline macht oder nicht. inline wird grob gesagt bei kurzen fkt. genommen die... google einfach mal da sind da prof. antworten
const bedeutet in dem fall, imho das die methode keine membervaribalen verändern kann, in diesem fall ist es ja gewollt, da wir nur lesen möchten nicht die membervaribale alter verändern wollen
std::cout und cout ist das gleiche
cout liegt in einem namensraum ist keine "globale" sache wie
int, char, #include ect
ebenso string
der namensraum heisst std
du kannst deshalb den namensraum jedes mal angeben std::cout
oder oben einmal
using namespace std; machen dann nimmt er bei allen sachen std:: automatisch davor
du kannst auch deine klasse in einem eigenen namensraum setzen
z.b. testnamensraum
und jedes mal das dann davorschreibenwarum man das alles macht?
weil es sehr sehr viele klassen gibt und man konflikte aus dem weg gehen will
z.b. deine find() methode und die von string.find
-
ja nur das problem ist, das wenn ich
using namespace std;
hineinschreibe, dann gibts keim compil. imer fehler, so dass ich das wieder raus nehmen muss
-
Ohne Fehlermeldung des Compilers können wir nicht helfen..
Also, was spuckt er aus? Es muss gehen, ansonsten hält sich dein Compiler nicht an den Standard. Daher: notfalls Compilertausch