Probleme mit einer Klasse...
-
noch was:
kann man die variablen eigentlich (wieder) als private deklariern? die funktion zur ansteuerung steht ja in der klasse selbst!? oder gehts dann nich mehr bzw. kommt dann was anderes raus?
die funktionen, müssen diese public sein? sie müssen ja eigentlich nicht von außen angesteuert werden...danke,
thomas
-
der konstruktor hat keinen rueckgabewert - also
int Musician::Musician()aus
Musician::Musician()umaendern.
USI b_year; USI b_month; USI b_day;muss auch raus.
-
danke MFK!
jetzt hats ohne probleme kompiliert!!kannst du mir nun vielleicht noch bei meinen anderen fragen helfen?
mfg thomas
-
ja, du kannst die funktionen und die variablen private machen wenn du sie nicht von 'aussen' benoetigst. innerhalb der klasse kann jedes element auf jedes andere zugreifen - also public funktionen koennen auch auf private daten oder funktionen zugreifen.
-
@ Cpt.Tanga:
die variablen sin jetzt auch raus!auch dir nochmal danke

mfg thomas
-
super, jetzt funktioniert alles, wie ich es haben wollte...
vielen danke nun euch und vorallem dir Cpt.Tanga!ich glaub jetzt komm ich wieder etwas weiter

mfg thomas
-
Dauermuede schrieb:
int ran_b_year() { b_year = 1950+(rand()%60); return b_year; }Ich picke mal diese Methode raus. Das gilt aber auch für die anderen.
Es ist nicht sinnvoll, hier die Membervariable zu setzen und zurückzugeben. Wenn du die Methode so wie in deinem Konstruktor benutzt, passiert folgendes:
(in der Methode)
- b_year wird gesetzt
- der Wert von b_year wird zurückgegeben
(im Konstruktor)
- b_year wird nochmal gesetzt (auf den Wert, den es schon hat)Entweder:
Die Methode setzt die Membervariable und gibt nichts zurück.
Oder:
Die Methode ermittelt den Zufallswert und gibt ihn zurück, lässt aber die Membervariable in Ruhe.
Wenn du beides vermischst, gibt das nur Käse.
-
wenn mans so sieht kann man die fufallsfunktionen auch ganz in den konstruktor auslagern (is ja eher unwahrscheinlich dass man nachtraeglich nochmal zufaellig das alter setzen moechte) - haette man auch gleich ne bessere performance
.
-
hab den rückgabewert jetzt rausgenommen...
es funktioniert zwar beides, aber da "return" überflüsig zu sein scheint, hab ichs jetzt entfernt.
danke auch hierfür!mfg thomas
-
Cpt.Tanga schrieb:
wenn mans so sieht kann man die fufallsfunktionen auch ganz in den konstruktor auslagern (is ja eher unwahrscheinlich dass man nachtraeglich nochmal zufaellig das alter setzen moechte) - haette man auch gleich ne bessere performance
.gut hab ich jetzt auch gemacht...
wenn du sagst, dass es der perfomance dient, wirds schon stimmen
.
ich mein jetzt spielt das noch keine rolle, aber das projekt befindet sich ja noch sehr am anfang
mfg thomas
-
hmm hab jetzt wieder ein problem...
rand() scheint nich mehr zu funktionieren

ich hab einen Array erstellt (Musician Musi[3]), was am anfang auch funktioniert hat... aber wenn ich jetzt kompiliere, kommen immer die gleichen werte raus, beim ausführen. hab dann wieder "Musician Musi[3]" rausgenommen, aber es bleibt jetzt bei den gleichen werten, obwohl ich an den random-funktionen nichts geändert habe!
könnte das problem vielleicht an dev c++ liegen?
aber bei einem anderen "zufalls-programm" funktioniert alles einwandfrei
-
du musst srand() vorher aufrufen (mit time(0)) aber nicht im konstruktor und nur 1 mal im programm-am besten ganz am anfang in der main.
-
es steht ja am anfang der main-funktion und wird nur einmal ausgeführt... die ganze zeit hats ja geklappt keine ahnung warums jetzt nich mehr tut!?!
main.cpp
#include "people.h" int main() { srand((unsigned)time(NULL)); int i; Musician One; Musician Two; Musician Three; cout << "Geburtstag Musiker 1: " << One.b_day << endl; cout << "Geburtsmonat Musiker 1: " << One.b_month << endl; cout << "Geburtsjahr Musiker 1: " << One.b_year << endl; cout << "Geburtstag Musiker 2: " << Two.b_day << endl; cout << "Geburtsmonat Musiker 2: " << Two.b_month << endl; cout << "Geburtsjahr Musiker 2: " << Two.b_year << endl; cout << "Geburtstag Musiker 3: " << Three.b_day << endl; cout << "Geburtsmonat Musiker 3: " << Three.b_month << endl; cout << "Geburtsjahr Musiker 3: " << Three.b_year << endl; cin >> i; return 0; }people.h
#include <time.h> #include <stdlib.h> #include <iostream> using namespace std; typedef unsigned short int USI; class Musician { public: Musician(); USI b_day; // day of birth (value between 1 and 30 USI b_month; // month of birth (value between 1 and 12) USI b_year; // year of birth (value between 1950 and 1990 }; Musician::Musician() { int ran_b_year() { b_year = 1950+(rand()%41); } int ran_b_month() { b_month = 1+(rand()%12); } int ran_b_day() { if (b_month == 2) { b_day = 1+(rand()%27); } else { b_day = 1+(rand()%29); } } }
-
du kannst keine funktionen inerhalb von funktionen schreiben,
(dein compiler sollte sich beschweren und sowas sagen wie "error: primary-expression expecteted")
versuchs mal so://people.h #include <ctime> #include <cstdlib> //fein die c++ header verwenden #include <iostream> using namespace std; typedef unsigned short int USI; class Musician { public: Musician(); USI b_day; // day of birth (value between 1 and 30 USI b_month; // month of birth (value between 1 and 12) USI b_year; // year of birth (value between 1950 and 1990 }; Musician::Musician() { b_year = 1950+(rand()%41); b_month = 1+(rand()%12); if (b_month == 2) b_day = 1+(rand()%27); else b_day = 1+(rand()%29); }//main.cpp #include "people.h" int main() { srand((unsigned)time(NULL)); int i; Musician One; Musician Two; Musician Three; cout << "Geburtstag Musiker 1: " << One.b_day << endl; cout << "Geburtsmonat Musiker 1: " << One.b_month << endl; cout << "Geburtsjahr Musiker 1: " << One.b_year << endl; cout << "Geburtstag Musiker 2: " << Two.b_day << endl; cout << "Geburtsmonat Musiker 2: " << Two.b_month << endl; cout << "Geburtsjahr Musiker 2: " << Two.b_year << endl; cout << "Geburtstag Musiker 3: " << Three.b_day << endl; cout << "Geburtsmonat Musiker 3: " << Three.b_month << endl; cout << "Geburtsjahr Musiker 3: " << Three.b_year << endl; cin >> i; return 0; }es nützt übrigens nichts, eine eigene headerdatei für die klasse zu schreiben, wenn du ihr nicht auch eine eigene .cpp datei gibst.
-
nachdem ich es jetzt im konstruktor so umgeschrieben habe, funktioniert es wieder. was mich nur verwundert: vorher hat es auch funktioniert, so wie ich es vorhin gepostet habe

naja hauptsache ist, dass es wieder geht! danke!
zur sache mit dem header:
der header wird noch erweiter... die klasse ist also nur ein teil davon. der grund, dass ich ein header verwende, ist eigentlich "nur" die übersichtlichkeit. ich will nicht alles in die main.cpp packen. somit bliebe das programm auch "modular".mfg thomas
-
hallo!
habe erneut ein problem mit meiner klasse... diesmal gehts aber ausnahmsweise NICHT ums geburtsdatum. das scheint jetzt endlich stabil zu sein.
jetzt geht es um die "namenvergabe". hier hat eigentlich alles am anfang funktioniert (den code habe ich vorerst mal von "00x" - sorry für den "klau"
). dann habe ich eine zweite datei auslesen wollen, die dann den vornamen bestimmt. da kam das
1. problem auf: es wurde nur der nachname zufällig bestimmt... "GivenName" blieb immer leer.doch nun gibt es ein weiteres problem... wieder ohne dass ich den code verändert hatte:
jetzt wird nur noch die erste zeile aus der datei für alle namen genommen... und das immer!hier der code vom konstruktor:
Musician::Musician() { b_year = 1950+(rand()%41); b_month = 1+(rand()%12); if (b_month == 2) b_day = 1+(rand()%27); else b_day = 1+(rand()%29); ran_Name(); ran_GivenName(); ran_VoiceHeight(); ran_VoiceType(); } ran_Name() { int zeile1 = 1+(rand()%73); ifstream file; file.open("names.txt"); // for(int w = 1; w <= zeile1; w++) getline(file,Name); file.close("names.txt"); } ran_GivenName() { int zeile2 = 1+(rand()%58); ifstream file2; file2.open("gnames.txt"); // for(int x = 1; x <= zeile2; x++) getline(file2,GivenName); } ran_VoiceHeight() { int zeile3 = 1+(rand()%2); ifstream file3; file3.open("voice_h.txt"); // for(int y = 1; y <= zeile3; y++) getline(file3,VoiceHeight); } ran_VoiceType() { int zeile4 = 1+(rand()%2); ifstream file4; file4.open("voice_t.txt"); // for(int z = 1; z <= zeile4; z++) getline(file4,VoiceType); }die funktionen hatte ich anfangs auch direkt im konstruktor (auf die gleiche art, wie diejenigen fürs geburtsdatum...
danke schonmal,
thomasedit: könntet ihr mir vielleicht auch erklären, für was die for-schleife gut ist? anfangs hat es nämlich sowohl mit als auch ohne einwandfrei funktioniert, weshalb ich sie dann auskommentiert habe...
edit2: es gibt bei dem ganze übrigens keine compiler-fehler...
-
bitte helft mir!
ich komm da echt nich weiter...
-
deine ganzen funktionen sollten im grundgeruest so in etwa aussehen:
void ran_any() { int zeile=1+(rand()%anzahlZeilenInDatei); ifstream file; file.open("dateiname.txt"); for(int i=1;i<=zeile;++i) getline(file,stringVar); file.close(); };dann muesste es auch mit dem zufall wieder stimmen. in der variable 'zeile' steht also die nummer der zeile welche zufaellig ausgewaehlt wurde. dann wird in der for schleife solange aus der datei ausgelesen bis man an dieser zeile angekommen ist, und dieser inhalt sollte dann in 'stringVar' stehen.
-
void ran_Name() { int zeile1 = 1+(rand()%73); ifstream file; file.open("names.txt"); for(int w = 1; w <= zeile1; w++) getline(file,Name); file.close(); }hier... habs ja so

am anfang hats ja auch funktioniert... nur jetzt gehts nimmer
hab jetzt erst gedacht, es lag daran, dass ich die funktion nicht mit void initialisiert habe, aber das wars nun auch nich...
-
es ist zum verzweifeln...
hab jetzt die for-schleife in eine "umständliche" while- und if-schleife umgeschrieben... aber immernoch das gleiche!
wie wenn die erste zeile in der variable festgefressen wäre...
die variable bzw. den string explizit leer zu definieren bringt auch nix -> es kommt dann auch die erste zeile aus der datei