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

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top