Einen void Pointer kann man in den meisten Fällen durch templates (siehe verkette Listen) oder durch gemeinsame Eltern Klassen von dennen die möglichen Klassen abgeleitet sind umgehen.
Das mit den gemeinsamen Basisklassen kannste dir so vorstellen:
( Beispiel (Netzwerk Übertragung) )
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
enum PACKETID // Welche Art von Packet?
{
PACKETID_GENERIC = 0, // Eltern Klasse.
PACKETID_PLAYERINFO = 1, // Eine abgeleitete Klasse...
PACKETID_LEVELDATAS = 2 // noch ne abgeleitete Klasse.
};
class GENERIC_PACKET
{
protected:
USHORT ID;
USHORT Size;
public:
//....
};
class PLAYERINFO_PACKET : public GENERIC_PACKET
{
private:
USHORT Energie;
USHORT xPos,yPos;
//....
};
class LEVELINFO_PACKET : public GENERIC_PACKET
{
BYTE RawData;
//...
};
/* So könnte man dann casten: wenn man übern Netzwerk ein Packet enthält geht man erstmal davon aus das man die Basisklasse erhält mit größe und ID */
GENERIC_PACKET AusDemNetzWerkStream;
switch(AusDemNetzWerkStream.ID)
{
case PACKETID_PLAYERINFO:
PLAYERINFO_PACKET PInfo = (PLAYERINFO_PACKET)AusDem...;
//...
}
|
Hoffe du kannst dir das jetzt ein wenig vorstellen.
Der Code ist wahrscheinlich total durcheinander und unschön aber hier gehts nur ums Verständnis. Das casten sollte man mit den C++ casts machen und nicht mit diesen C Hacks.
Ciao DarthB