C ++ классы - объявление конструктора в производном классе
-
23-08-2019 - |
Вопрос
Сокет имеет конструктор, который принимает розетку Winsock в качестве параметра и хранит его в частной переменной:
Socket::Socket(SOCKET s) {
this->s = s;
}
Я пытаюсь сделать класс «Gamesocket», который будет анализировать данные из моего класса сокета:
class GameSocket : public Socket {
protected:
void ParseData(unsigned char* data, int size);
};
Рядом с этими классами у меня есть класс «сервера», который создает новые розетки, когда это необходимо:
GameSocket* Server::Accept() {
SOCKET a = accept(s, 0, 0);
if(a==SOCKET_ERROR) {
return 0;
}
else {
return new GameSocket(a);
}
}
Тем не менее, это дает мне ошибку на последнем "еще":
error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'
Я должен что -то упустить с конструкторами при работе с производными классами ...
Не ходи меня слишком усердно, я относительно новичок в C ++ и OOP
Решение
Добавьте конструктор для Gamesocket
class GameSocket : public Socket {
public:
// you need to add
GameSocket(SOCKET s) : Socket(s) {}
protected:
void ParseData(unsigned char* data, int size);
};
Другие советы
Конструкция для Gamesocket должна получить параметр сокета, а затем передать его в базовый класс сокетов в списке инициализаторов:
class GameSocket : public Socket {
public:
GameSocket(SOCKET s) : Socket(s) {}
...
};
Есть ли причина, по которой Gamesocket должен вытекать из сокета вместо того, чтобы удерживать ссылку на розетку? Gamesocket - это (или должно быть) управлять состоянием сокета и сериализации, в то время как интерфейс сокета низкого уровня содержится в классе сокета. Ваш класс сервера может создать экземпляры класса сокета, а затем передавать указатель классу GameStocke для управления ими.
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;
}