문제

소켓에는 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);
    }

}

그러나 이것은 마지막 "else"에 대한 오류를 제공합니다.

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의 Compurucotr는 소켓 매개 변수를 수신 한 다음 이니셜 라이저 목록의 소켓 기본 클래스로 전달해야합니다.

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

Gamesocket이 소켓에 대한 참조를 유지하는 대신 소켓에서 파생 해야하는 이유가 있습니까? Gamesocket은 소켓 상태 및 직렬화를 관리하는 반면 낮은 레벨 소켓 인터페이스는 소켓 클래스에 포함되어 있습니다. 서버 클래스는 소켓 클래스의 인스턴스를 생성 한 다음 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top