Классы C ++ - объявление конструктора в производном классе - PullRequest
1 голос
/ 22 декабря 2008

Socket имеет конструктор, который принимает в качестве параметра winsock SOCKET и сохраняет его в закрытой переменной:

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

Я пытаюсь создать класс "GameSocket", который будет анализировать данные из моего класса Socket:

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

}

Однако, это дает мне ошибку в последнем «else»:

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

Я должен что-то упустить с конструкторами при работе с производными классами ...

Не обращай на меня внимание, я относительно новичок в C ++ и ООП

Ответы [ 2 ]

6 голосов
/ 22 декабря 2008

Добавить в конструктор для GameSocket

class GameSocket : public Socket {

public:

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

protected:

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

};
2 голосов
/ 22 декабря 2008

Конструктор для GameSocket должен получить параметр SOCKET и затем передать его базовому классу Socket в списке инициализатора:

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

Есть ли причина, по которой GameSocket должен наследоваться от Socket, а не содержать ссылку на Socket? GameSocket (или должен) управлять состоянием сокета и сериализацией, в то время как интерфейс сокетов низкого уровня содержится в классе Socket. Ваш класс Server может создавать экземпляры класса Socket, а затем передавать указатель на класс GameSocket для управления ими.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...