سؤال

يحتوي المقبس على منشئ يأخذ مقبس Winsock كمعلمة وتخزينها في متغير خاص:

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

أحاول إنشاء طبقة "ألعاب" التي ستحليل البيانات من فئة المقبس الخاصة بي:

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

هل كانت مفيدة؟

المحلول

إضافة في منشئ للأماكن

class GameSocket : public Socket {

public:

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

protected:

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

};

نصائح أخرى

يجب أن تتلقى Construcomotr للأعميم معلمة مأخذ توصيل ثم تمريرها إلى فئة قاعدة المقبس في قائمة التهيئة:

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

هل هناك سبب يجب أن تستمد Gamequocket من المقبس بدلا من إجراء مرجع إلى المقبس؟ 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