C ++ الفصول - إعلان المنشئ في الفصل المستمد
-
23-08-2019 - |
سؤال
يحتوي المقبس على منشئ يأخذ مقبس 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;
}