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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: наследование и d_func()  (Прочитано 10057 раз)
ilyagoo
Гость
« : Ноябрь 26, 2009, 09:48 »

есть классы
Код:
class TClient: public QTcpSocket
class TServer: public QTcpServer
хочу переопределить виртуальную функцию
Код:
QTcpServer::incomingConnection()

а именно:

Код:
void QTcpServer::incomingConnection(int socketDescriptor)
{
#if defined (QTCPSERVER_DEBUG)
    qDebug("QTcpServer::incomingConnection(%i)", socketDescriptor);
#endif

    // создается новый сокет, здесь хотелось бы создавать нового TClient
    QTcpSocket *socket = new QTcpSocket(this);
    // установка дескриптора, полученного от системы останется
    socket->setSocketDescriptor(socketDescriptor);

    // добавление нового сокета в очередь соединений, откуда он будет вынут QTcpServer::nextPendingConnection()
    d_func()->pendingConnections.append(socket);
}

я так понимаю, d_func() - private член класса QTcpServer, и наследник ее вызвать не может... как с этим бороться? добавить-то в список клиента вроде как надо...
Записан
Rcus
Гость
« Ответ #1 : Ноябрь 26, 2009, 10:52 »

А зачем его добавлять в список? Ну если уж так хочется - создайте свою очередь и переопределите virtual bool hasPendingConnections () const и virtual QTcpSocket * nextPendingConnection () для сохранения функциональности.
Записан
BRE
Гость
« Ответ #2 : Ноябрь 26, 2009, 10:54 »

Не надо, если ты перекрываешь incomingConnection, то всю ответственность по созданию и удаления QTcpSocket берешь на себя.
Другой вариант это использовать:
void QTcpServer::newConnection ()   [signal]
и
QTcpSocket * QTcpServer::nextPendingConnection ()   [virtual]

тогда сам QTcpServer будет владельцем созданных QTcpSocket.
Записан
ilyagoo
Гость
« Ответ #3 : Ноябрь 26, 2009, 11:13 »

А зачем его добавлять в список? Ну если уж так хочется - создайте свою очередь и переопределите virtual bool hasPendingConnections () const и virtual QTcpSocket * nextPendingConnection () для сохранения функциональности.

как раз переопределение этих функций я и не планировал, т.к. если бы мне удалось добавить в список свой объект, nextPendingConnection() возвращал бы то, что нужно.

есть еще вариант: полностью переписать QTcpServer, он как раз небольшой Улыбающийся

а создавать свой список - не айс, у QTcpServerPrivate уже есть один, и, сдается мне, что это не очень-то хороший тон...
может варианты все-таки есть?
Записан
BRE
Гость
« Ответ #4 : Ноябрь 26, 2009, 11:16 »

может варианты все-таки есть?
А чем не устраивает вариант с сигналом newConnection?
Записан
ilyagoo
Гость
« Ответ #5 : Ноябрь 26, 2009, 11:27 »

Цитировать
А чем не устраивает вариант с сигналом newConnection?

а что он мне даст? ведь к моменту его вызова QTcpSocket уже создан, а мне нужно иметь там своего TClient.

к предыдущему посту:
тем более, что в
Код:
void QTcpServerPrivate::readNotification()
есть строчка
Код:
        if (pendingConnections.count() >= maxConnections) {
значит я не должен использовать свой список
Записан
BRE
Гость
« Ответ #6 : Ноябрь 26, 2009, 11:35 »

а что он мне даст? ведь к моменту его вызова QTcpSocket уже создан, а мне нужно иметь там своего TClient.
Упс, это я упустил.  Улыбающийся
Тогда, только наследованием.

А для чего ты хочешь сохранять все сокеты? Какая структура приложения?
Скажем, если этот сокет передается в отдельный поток, который обслуживает соединение с клиентом, проще будет самому удалять объект сокета в потоке при завершении связи.
Записан
ilyagoo
Гость
« Ответ #7 : Ноябрь 26, 2009, 11:42 »

Цитировать
А для чего ты хочешь сохранять все сокеты?
я и не хочу Подмигивающий

просто мне нужно подменить QTcpSocket у QTcpServer своим объектом
Записан
BRE
Гость
« Ответ #8 : Ноябрь 26, 2009, 11:45 »

я и не хочу Подмигивающий

просто мне нужно подменить QTcpSocket у QTcpServer своим объектом
Код
C++ (Qt)
void QTcpServer::incomingConnection(int socketDescriptor)
{
#if defined (QTCPSERVER_DEBUG)
   qDebug("QTcpServer::incomingConnection(%i)", socketDescriptor);
#endif
 
   // создается новый сокет, здесь хотелось бы создавать нового TClient
   QTcpSocket *socket = new QTcpSocket( 0 );
   // установка дескриптора, полученного от системы останется
   socket->setSocketDescriptor(socketDescriptor);
 
   emit clientConnected( socket );
 
// или
 
   TClientThread *thread = new TClientThread( socket );
   thread->start();
}
 
Записан
ilyagoo
Гость
« Ответ #9 : Ноябрь 26, 2009, 11:52 »

они же там хранятся, пока их не вынут:
Код:
QTcpSocket *QTcpServer::nextPendingConnection()
{
    Q_D(QTcpServer);
    if (d->pendingConnections.isEmpty())
        return 0;

    if (!d->socketEngine->isReadNotificationEnabled())
        d->socketEngine->setReadNotificationEnabled(true);

    return d->pendingConnections.takeFirst();
}
мы, кажется, друг друга не поняли Улыбающийся
Записан
ilyagoo
Гость
« Ответ #10 : Ноябрь 26, 2009, 12:59 »

а есть ли какая-нибудь "технология", позволяющая создать, например, свой класс типа QTcpServer. да, вопрос корявый...
короче, я взял исходники сервера и тупо перебил все имена, тут-то линкер и накидал ошибок Грустный
типа таких:
Код:
1>netserver.obj : error LNK2019: unresolved external symbol "public: unsigned short __thiscall QAbstractSocketEngine::localPort(void)const " (?localPort@QAbstractSocketEngine@@QBEGXZ) referenced in function "public: bool __thiscall TNetServer::listen(class QHostAddress const &,unsigned short)" (?listen@TNetServer@@QAE_NABVQHostAddress@@G@Z)
1>qabstractsocket.obj : error LNK2001: unresolved external symbol "public: unsigned short __thiscall QAbstractSocketEngine::localPort(void)const " (?localPort@QAbstractSocketEngine@@QBEGXZ)

функция QAbstractSocketEngine::localPort() существует, но из QtNetwork4.dll она действительно не торчит. попробовал добавить в проект соответствующие исходники - толку мало. вот и интересуюсь "технологией". может кто-нибудь знает Qt глубже и сможет что-то посоветовать?
Записан
BRE
Гость
« Ответ #11 : Ноябрь 26, 2009, 13:11 »

они же там хранятся, пока их не вынут:
они туда кладутся методом incomingConnection, если ты его переопределил, то ничего и никуда класться не будет. pendingConnections будет пустым.
Записан
ilyagoo
Гость
« Ответ #12 : Ноябрь 26, 2009, 13:15 »

так и я про то же, я ведь искал как их туда добавить при переопределении incomingConnection(). похоже, никак Грустный
а по поводу "технологии" какие мысли?
Записан
BRE
Гость
« Ответ #13 : Ноябрь 26, 2009, 13:26 »

так и я про то же, я ведь искал как их туда добавить при переопределении incomingConnection(). похоже, никак Грустный
а по поводу "технологии" какие мысли?
А технология одна:
При подключении клиента, будет вызван incomingConnection, что в нем будет происходить это решать тебе: сохранять или нет список сокетов, передавать готовый сокет потоку или просто посылать сигнал.

Поищи по форуму, подобные темы несколько раз поднимались, были обсуждения с примерами кода и т.д.
Записан
ilyagoo
Гость
« Ответ #14 : Ноябрь 26, 2009, 13:45 »

да я не о том Веселый
я имел в виду "технологию" несколькими моими постами выше, это про Qt в общем
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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