naja ich hab ne Würfel Klasse und ne Mensch Klasse. so es soll überprüft werden wer gewonnen hat: Mensch oder Computer Diese Funktion ist Bestandteil der Würfelklasse: CWurfel::gewonnen(); Wenn der Mensch gewonnen hat, soll sein Name ausgeben werden. Die Namen funktion ist aber in der Klasse Mensch..
*Idee..ah ich glaub ich weiß wie ich es mache.. *bastel* ok es klappt ich habs jetzt so geamcht: eine Funktion returnName in der Klasse Mensch definiert, die den Namen zurückgibt. Den Namen dann in einer Variablen im Hauptprogramm übergeben: string sname=Mensch.returnName(); Dann die Variabkle der gewonnen Funktion als Parameter überegeben: gewonnen(sname);
und zack! hat geklappt...
jetzt nur noch (immer noch) die Zufallsfunktion...
du darst nur einmal beim initialiesieren srand aufrufen... z.b. im konsturktor der initialisiert den "zufall" (auf dem rechner gibt es kein zufall sondern das ist auch nur ne errechnete folge von pseudorandom numbers...
das selbe kommt immer raus weil er bei initialiseren nur die minuten der uhrzeit nimmt und die zeit nicht so schnell vergeht wie dein programm durchläuft...
deswegen nur im konstruktor srand(time(NULL)) aufrufen dann funzt das auch -- ...fleißig wie zwei Weißbrote
class CKarte { public: CKarte(); void setzeSymbol(); }
CKarte.cpp:
C++:
CKarte::CKarte() { srand(time(NULL)); };
void CKArte::setzeSymbol(); { rand(); };
das mit der zeit war mir schon klar...deswegen dächt ich dass ich irgendwas mit getttimeofday oder so nehmen könnte, weil das so da erwähnt worden ist, wenn man die Funktion mehrmals pro Sekunde aufrufen will..
cya THX!
MfG Fraenky -- Welcome to the real World.
www.fraenkysweb.deDieser Post wurde am 25.03.2004 um 13:31 Uhr von Fraenky editiert.
jo zum beispiel.... du kannst es auch einfach aufrufen in deinem programm bevor du objecte von der klasse instantierst.... ist wahrscheinlich auch sinnvoller wenn man mehrer objekte der klasse anlegen will. wenn man eh nur ein object erstellt würd ichs im konstruktor lassen.... -- ...fleißig wie zwei Weißbrote
for(i=0;i<anzahl;++i)menscharray[i]=new Mensch(......)// welchen Konstruktor auch immer du dazu verwenden willst...
angenommen du willst jetzt mensch 3 ansprechen (anmerkung hierzu arrays gehen in c immer von 0 bis anzahl-1, das heisst mensch nummer drei würdest du mit arrayindex 2 ansprechen...)
C++:
menscharray[2]->set..... /oder welche memberfunktion bzw.memberattribut auch immer du ansprechen willst
am ende nicht vergessen den speicher wieder freizugeben
Was ist eine Memberfunktion? und was bedeuted ->set...
das ist eine funktion die zu deiner klasse gehört also z.b. deine setSymbol funktion von CKarte ist eine memberfunktion deiner klasse CKarte
Zitat:
was bedeuten die sternchen: ** bzw * (sprechen die den Speicher der variable an??)
das ist ein doppelter pointer....
so und nun mal zu dem warum ich das gemacht habe... wenn du nur mit dem defaultkonstruktor arbeitest tuts auch ein einfacher pointer weil du dann gleich so allokieren kannst
C++:
CMensch *menscharray=new CMensch[anzahl];
dabei werden dann anzahl CMensch-objecte mit dem defaultkonstruktor erstellt....
meist will man aber seinen oder irgend einen (man kann mehrer konstruktoren definieren) verwenden und dass geht dann nicht weil c++ nicht sowas vorsieht
C++:
CMensch *menscharray=new CMensch(.....)[anzahl];
deshalb bist du in diesem falle dann auf das doppelpointerarray angewiesen...
so und nun zu dem -> operator.... wenn du ein public member eines objectes einer klasse ansprechen willst nimmst du den .-operator....
dann man oft pointer von bzw. auf objecte hat müsste man immer erst dereferenzieren und dann denn punkt verwenden
also so (*pointer_auf_object).member
das ist auf dauer ziemlich nervig und deshalb gibt des den -> operator der das gleich macht wie (*pointer_auf_object).member -- ...fleißig wie zwei Weißbrote