C ++ - Klassen - Konstruktorerklärung in der abgeleiteten Klasse
-
23-08-2019 - |
Frage
Socket verfügt über einen Konstruktor, der einen Winsock -Socket als Parameter nimmt und in einer privaten Variablen speichert:
Socket::Socket(SOCKET s) {
this->s = s;
}
Ich versuche eine Klasse "Gamesocket" zu erstellen, die Daten aus meiner Socket -Klasse analysiert:
class GameSocket : public Socket {
protected:
void ParseData(unsigned char* data, int size);
};
Neben diesen Klassen habe ich eine "Server" -Klasse, die bei Bedarf neue Sockets erstellt:
GameSocket* Server::Accept() {
SOCKET a = accept(s, 0, 0);
if(a==SOCKET_ERROR) {
return 0;
}
else {
return new GameSocket(a);
}
}
Dies gibt mir jedoch einen Fehler beim letzten "sonst":
error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'
Ich muss etwas mit Konstruktoren fehlen, wenn ich mich mit abgeleiteten Klassen befasse ...
Gehen Sie nicht zu hart auf mich, ich bin relativ neu in C ++ und OOP
Lösung
Fügen Sie einen Konstruktor für GameSocket hinzu
class GameSocket : public Socket {
public:
// you need to add
GameSocket(SOCKET s) : Socket(s) {}
protected:
void ParseData(unsigned char* data, int size);
};
Andere Tipps
Der Konstrukte für GameSocket muss einen Socket -Parameter erhalten und ihn dann in der Initialisiererliste an die Socket -Basisklasse weitergeben:
class GameSocket : public Socket {
public:
GameSocket(SOCKET s) : Socket(s) {}
...
};
Gibt es einen Grund, warum GameSocket aus Socket stammen muss, anstatt einen Verweis auf die Sockel zu haben? GameSocket ist (oder sollte) den Socket -Status und die Serialisierung verwalten, während die Socket -Schnittstelle mit niedriger Ebene in der Socket -Klasse enthalten ist. Ihre Serverklasse kann Instanzen der Socket -Klasse erstellen und dann einen Zeiger an eine GameSocket -Klasse übergeben, um sie zu verwalten.
class GameSocket {
public:
GameSocket(Socket *s) : s_(s) {}
~GameSocket() {
s_->close();
delete s_;
}
...
private:
Socket *s_;
};
GameSocket* Server::Accept() {
// accept function added to Socket class
Socket *newSocket = serverSocket->accept();
// create GameSocket with newly opened Socket
return newSocket ? new GameSocket(newSocket) : NULL;
}