Bonjour !
Alors j'ai 2 petits problèmes, le premier, au niveau de l'écriture d'un template:
Avant j'avais dans ma classe
Et en passant sur le chapitre templates de mon bouquin, je me suis dis que je devais changer ca !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int GetHeader(); int GetAction(); int ReadInt(); long ReadLong(); std::string ReadString();
Ma classe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class Packet { private: int index; queue<byte> *bytes; public: Packet(); Packet(char &s); ~Packet(); template<typename T>void read(T &buf); void Next(); Packet& operator+(long l); Packet& operator+(int i); Packet& operator+(char *s); Packet& operator+(byte b); }; int substr(char *s, int start, int length);J'aimerais pouvoir faire par exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
40
41 Packet::~Packet() { //delete this; } Packet::Packet() { } Packet::Packet(char &s) { bytes = new queue<byte>; int len = strlen(&s); cout << &s << endl; int _bytes = floor((float)len/2)-floor((float)len/6); for(int i=1; i<=_bytes; ++i) { bytes->push(substr(&s, (i-1)*3, 1)); } } void Packet::Next() { ++index; } template<typename T>void Packet::read(T &buf) { cout << "size of argument: " << sizeof(T) << endl; } Packet& Packet::operator+(long l) { return *this; } Packet& Packet::operator+(int i) { return *this; } Packet& Packet::operator+(char *s) { for(int i = 0; i < strlen(s); ++i) { bytes->push(s[i]); } return *this; } Packet& Packet::operator+(byte b) { bytes->push(b); return *this; } int substr(char *s, int start, int length) { char t[2] = {s[start], s[(start+length)]}; return (int)strtol(t, NULL, 16); }
Voila,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 char *p = "01 02 05 6b 6b 6b 6b 6b ff aa"; Packet *pk = new Packet(*p); int h, a, l; long v; char *str; pk->read(h); // h = 01 - readint pk->read(a); // a = 02 - readint pk->read(str); // str = 6b 6b 6b 6b 6b (en prenant en compte de lire le 05 = length du str) pk->read(v); // v = aa ff
le deuxième problème est au niveau de la surcharge d'operateurs
J'ai un thread
Plus bas, j'accepte un socket et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DWORD WINAPI ls_Listen(LPVOID para) { XServer::LoginServer *ls = (XServer::LoginServer *) para; //[.......]
Donc je creer mon object client, en donnant toutes les valeurs (tout va bien)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Client *c = new Client((std::string)inet_ntoa(csin.sin_addr), (int)ntohs(csin.sin_port), csock); ls += c;
VC2010 me dit que 'c' doit avoir un type integral ou enum ?!
La déclaration de LoginServer operator+:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 XServer::LoginServer& XServer::LoginServer::operator+(Client &c) { Clients += c; return *this; }
La déclaration de Clients operator+:
Comment faire pour corriger cette erreur?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Sessions& Sessions::operator+(Client &c) { clients[c.Get()->_aid] = &c; return *this; }
Merci d'avance, nico
Partager