Russian Qt Forum
Ноябрь 25, 2024, 14:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как раширить QTcpSocket?  (Прочитано 6081 раз)
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. Возможно-ли здесь нечто подобное?

Пасиб, за дельные комменты.
Записан
crossly
Гость
« Ответ #1 : Апрель 28, 2010, 14:39 »

простите .... а что сие значит ??
Код:
class Socket : QTcpSocket(0)
Записан
Amigo_sa
Гость
« Ответ #2 : Апрель 28, 2010, 14:40 »

Код:
class Socket : QTcpSocket(0)
{
//тут мои переменные, методы и т.п.
}
Пасиб, за дельные комменты.

вы не указали тип наследования, по умолчанию он private, если не ошибаюсь
Нужно наследовать так
Код:
class Socket : public QTcpSocket
{
//тут мои переменные, методы и т.п.
}
Записан
Buran
Гость
« Ответ #3 : Апрель 28, 2010, 14:47 »

Звиняйте, когда копипастил из кода - промахнулся.)

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

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

Так что вопрос пока открыт....(
Записан
Amigo_sa
Гость
« Ответ #4 : Апрель 28, 2010, 14:50 »

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

необходимо приведение типа
Код:
Socket* client = dynamic_cast<Socket*>(nextPendingConnection()); 
Записан
Buran
Гость
« Ответ #5 : Апрель 28, 2010, 14:53 »

Касты уже пробовал.
Здесь катит, а дальше в коде начинаются траблы. Сейчас смоделирую и скажу где плохо становится.

Может мне смотреть не в сторону наследования, а в сторону встраивания с френдом?
« Последнее редактирование: Апрель 28, 2010, 15:03 от Buran » Записан
garryHotDog
Гость
« Ответ #6 : Апрель 28, 2010, 18:38 »

попробуй
Код:
 #include <QTcpSocket>
class CMySocket: public QTcpScoket()
{
  Q_OBJECT
....

а при вызове nextPendingConnection ():
Код:
CMySocket *pSocket=nextPendingConnection ();
Записан
BRE
Гость
« Ответ #7 : Апрель 28, 2010, 19:13 »

Ни какие приведения типов работать не будут. Внутри QTcpServer создается объект класса QTcpSocket, никаким образом его не получиться привести к классу-наследнику CMySocket.

У класса QTcpServer есть виртуальный метод:
void QTcpServer::incomingConnection ( int socketDescriptor )   [virtual protected]
который вызывается при подключении нового клиента.
Если его переопределить, то в нем можно создавать объекты класса CMySocket.
Записан
garryHotDog
Гость
« Ответ #8 : Апрель 28, 2010, 19:16 »

предыдущий пост в тему....смотри в примерах "Threaded Fortune Server Example"  - и будет тебе счастье Смеющийся
Записан
Buran
Гость
« Ответ #9 : Апрель 29, 2010, 11:27 »

Как я и говорил, косяк в приведении типа есть:

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

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

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

2BRE, не намекнете, почему такое приведение невозможно?Подмигивающий

Всем пасиб за дельные советы, пошел читать указанные экзамплы..)
« Последнее редактирование: Апрель 29, 2010, 11:51 от Buran » Записан
ритт
Гость
« Ответ #10 : Май 01, 2010, 19:20 »

намёк BRE был слишком тонким?))

открой исходник QTcpServer::incomingConnection() - и сразу станет всё понятно /* или не станет */
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 20.