Yoghurt hat geschrieben:Xin hat geschrieben:Ich meinte, dass es sich eben nicht um eine virtuelle Funktion handelt, wo zur Laufzeit eben noch nicht feststeht, welche Funktion genau benutzt wird.
Die virtuelle Funktion muss natürlich in einer Subklasse (von der dann die Instanz ist) überschrieben werden. Somit ist die Funktion ja determiniert, oder lieg ich da falsch?
Wenn Du das Objekt zwischenzeitlich mal über das Netzwerk bewegst, um dann eine Funktion zu rufen, die dann determiniert wird aufgrund eines Pointers, der für einen anderen Computer gültig wäre... ich würde sagen, dass hier die Chance auf den 6er im Lotto vergleichsweise gut ist.
Xin hat geschrieben:Yoghurt hat geschrieben:Und bei den anderen weiß die Instanz ja sowieso was sie ist.
Eine Methode von class Tier weiß nicht, ob es ein class Katze oder ein class Hund vor sich hat.
Wenn ich eine Klasse Tier habe die meinetwegen die virtuelle Methode bewegen() hat, und diese in den von Tier erbenden Klassen Hund (läuft) und Fisch (schwimmt) überschreibe, dann kann ich doch folgendes machen:
Code: Alles auswählen
Tier* tier;
//tier = new Tier(); //geht nicht wegen virtueller Methode
tier = new Hund();
tier.bewegen() //läuft
delete tier;
tier = new Fisch();
tier.bewegen() //schwimmt
delete tier;
tier = 0;
[/quote]
Alles richtig - aber nur solange Du Dich auf dem gleichen Computer befindest.
Und sobald Du das Tier durch ein Kupferkabel verschickt hast, bedeutet
Vollkommen egal, um welche Tierart es sich handelt
Yoghurt hat geschrieben:Xin hat geschrieben:Yoghurt hat geschrieben:Auf dem Client brauche ich dieses Array eigentlich ja nicht oder?
Ich hab mir das jetzt so vorgestellt: Der Client schickt die Event-ID an den Server und der schaut im Array nach zu welcher Funktion das Event gehört und führt diese dann aus.
Wäre dies über C++ Mittel realisiert, müsste der Client dieses Array in jedem Fall haben. Da der Virtual-Table-Pointer dann aber auf die VTable des Clienten zeigt, ist dieser Pointer beim Server mit an Sicherheit grenzender Wahrscheinlichkeit ein Zeiger ins Nirwana.
Das verstehe ich auch nicht. Warum muss der Client das Array kennen?
Weil der Client sonst die Klasse nicht erzeugen kann. Die Virtual Table gehört zur Klasse dazu. Die Virtual Table ist ein solches Array, nur dass die Virtual Table von C++ verwaltet wird - also eben Bordmittel sind - und das Array halt selbst gestrickt ist, weil man sich die Bordmittel über das Netzwerk kaputt macht.
Yoghurt hat geschrieben:Dann bekommt der Server übers Netzwerk diese Events.
Er holt sich über das assoziative Array die passende Funktion zum LoginEvent:
Dann wird func ausgeführt.
So würde ich mir das ungefähr vom Ablauf her vorstellen.
So sollst Du Dir das ja auch vorstellen. Die Idee ist nicht sonderlich innovativ, weil C++ diese Idee bei virtuellen Funktionen genauso benutzt. Da es Bordmittel sind, kommt man aber nicht an sie heran, man kann sie also nicht korrigieren, der Zeiger auf die Virtual-Table zeigt also beim Empfänger ins Nirwana und das kann nicht korrigiert werden. Also funktioniert es mit Bordmitteln nicht und muss nachgebildet werden. Daher die Idee mit dem Funktionspointer-Array.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.