简体   繁体   中英

C++ classes - constructor declaration in derived class

Socket has a constructor that takes a winsock SOCKET as parameter and stores it in a private variable:

Socket::Socket(SOCKET s) {
    this->s = s;
}

I'm trying to make a class "GameSocket" that will parse data from my Socket class:

class GameSocket : public Socket {

protected:

    void ParseData(unsigned char* data, int size);

};

Next to these classes, I have a "Server" class that creates new sockets when needed:

GameSocket* Server::Accept() {

    SOCKET a = accept(s, 0, 0);
    if(a==SOCKET_ERROR) {
        return 0;
    }
    else {
        return new GameSocket(a);
    }

}

However, this gives me an error on the last "else":

error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'

I must be missing something with constructors when dealing with derived classes...

Don't go too hard on me, I'm relatively new to C++ and OOP

Add in a constructor for GameSocket

class GameSocket : public Socket {

public:

    // you need to add
    GameSocket(SOCKET s) : Socket(s) {}

protected:

    void ParseData(unsigned char* data, int size);

};

The construcotr for GameSocket must receive a SOCKET parameter and then pass it to the Socket base class in the initializer list:

class GameSocket : public Socket {
public:
    GameSocket(SOCKET s) : Socket(s) {}
    ...
};

Is there a reason why GameSocket must derive from Socket instead of holding a reference to the Socket? GameSocket is (or should be) managing socket state and serialization while the low level socket interface is contained in the Socket class. Your Server class could create instances of the Socket class and then pass a pointer to a GameSocket class for managing them.

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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM