C ++ классы - объявление конструктора в производном классе

StackOverflow https://stackoverflow.com/questions/386345

Вопрос

Сокет имеет конструктор, который принимает розетку 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top