Russian Qt Forum

Qt => Общие вопросы => Тема начата: Buran от Апрель 28, 2010, 14:35



Название: Как раширить QTcpSocket?
Отправлено: Buran от Апрель 28, 2010, 14:35
Здравствуйте.

Мне нужно "расширить" класс QTcpSocket, с добавлением своих переменных, методов, перекрыть пару методов и деструктор.

В Socket.cpp определяю класс Socket:

Код:
class Socket : QTcpSocket(0)
{
//тут мои переменные, методы и т.п.
}

В Server.cpp файле пытаюсь сделать:

Код:
Socket* client = nextPendingConnection(); 
Получаю:
Код:
Server.cpp:25:error: invalid conversion from ‘QTcpSocket*’ to ‘Socket*’


В Java я делал это посредством extends. Возможно-ли здесь нечто подобное?

Пасиб, за дельные комменты.


Название: Re: Как раширить QTcpSocket?
Отправлено: crossly от Апрель 28, 2010, 14:39
простите .... а что сие значит ??
Код:
class Socket : QTcpSocket(0)


Название: Re: Как раширить QTcpSocket?
Отправлено: Amigo_sa от Апрель 28, 2010, 14:40
Код:
class Socket : QTcpSocket(0)
{
//тут мои переменные, методы и т.п.
}
Пасиб, за дельные комменты.

вы не указали тип наследования, по умолчанию он private, если не ошибаюсь
Нужно наследовать так
Код:
class Socket : public QTcpSocket
{
//тут мои переменные, методы и т.п.
}


Название: Re: Как раширить QTcpSocket?
Отправлено: Buran от Апрель 28, 2010, 14:47
Звиняйте, когда копипастил из кода - промахнулся.)

Вместо:
Код:
class Socket : QTcpSocket(0)

Читать:
Код:
class Socket : public QTcpSocket

Так что вопрос пока открыт....(


Название: Re: Как раширить QTcpSocket?
Отправлено: Amigo_sa от Апрель 28, 2010, 14:50
Код:
Socket* client = nextPendingConnection(); 
Получаю:
Код:
Server.cpp:25:error: invalid conversion from ‘QTcpSocket*’ to ‘Socket*’

необходимо приведение типа
Код:
Socket* client = dynamic_cast<Socket*>(nextPendingConnection()); 


Название: Re: Как раширить QTcpSocket?
Отправлено: Buran от Апрель 28, 2010, 14:53
Касты уже пробовал.
Здесь катит, а дальше в коде начинаются траблы. Сейчас смоделирую и скажу где плохо становится.

Может мне смотреть не в сторону наследования, а в сторону встраивания с френдом?


Название: Re: Как раширить QTcpSocket?
Отправлено: garryHotDog от Апрель 28, 2010, 18:38
попробуй
Код:
 #include <QTcpSocket>
class CMySocket: public QTcpScoket()
{
  Q_OBJECT
....

а при вызове nextPendingConnection ():
Код:
CMySocket *pSocket=nextPendingConnection ();


Название: Re: Как раширить QTcpSocket?
Отправлено: BRE от Апрель 28, 2010, 19:13
Ни какие приведения типов работать не будут. Внутри QTcpServer создается объект класса QTcpSocket, никаким образом его не получиться привести к классу-наследнику CMySocket.

У класса QTcpServer есть виртуальный метод:
void QTcpServer::incomingConnection ( int socketDescriptor )   [virtual protected]
который вызывается при подключении нового клиента.
Если его переопределить, то в нем можно создавать объекты класса CMySocket.


Название: Re: Как раширить QTcpSocket?
Отправлено: garryHotDog от Апрель 28, 2010, 19:16
предыдущий пост в тему....смотри в примерах "Threaded Fortune Server Example"  - и будет тебе счастье ;D


Название: Re: Как раширить QTcpSocket?
Отправлено: Buran от Апрель 29, 2010, 11:27
Как я и говорил, косяк в приведении типа есть:

Код:
Socket* client = dynamic_cast<Socket*>(nextPendingConnection());

Далее, если попытаться привязать сигнал, то после запуска ругается, что client - null;

Наверное, BRE прав.
Хотя, если честно, я не понял, почему нельзя привести тип. Разве, что там есть виртуальные методы, которые в моем классе должны быть обязательно переопределены?

2BRE, не намекнете, почему такое приведение невозможно?;)

Всем пасиб за дельные советы, пошел читать указанные экзамплы..)


Название: Re: Как раширить QTcpSocket?
Отправлено: ритт от Май 01, 2010, 19:20
намёк BRE был слишком тонким?))

открой исходник QTcpServer::incomingConnection() - и сразу станет всё понятно /* или не станет */