Russian Qt Forum

Qt => Вопросы новичков => Тема начата: dercas от Декабрь 03, 2012, 14:28



Название: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: dercas от Декабрь 03, 2012, 14:28
Здравствуйте, подскажите как правильно сделать.
Пытаюсь сделать каналы в чате, с помощью QHash.
Где QMultiHash<Название канала, QHash<Ник, ServerSocket *>*>

Здесь содержатся все ники и сокеты.
Код:
QHash<QString, ServerSocket *> nick_list;
nick_list.insert(nick, socket);

При входе на канал, ссылку на этот один ник и сокет, надо засунуть в хэш значения этого канала, что и не получается сделать...
но если вставлять ссылку на хэш всех ников, отлично работает..
Код:
  
QMultiHash<QString, QHash<QString, ServerSocket *>* > channel_list;
channel_list.insert(name_channel, &nick_list);

но тогда в хэше канала получаются все ники, а нужно именно те кто на канале.


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: mutineer от Декабрь 03, 2012, 15:37
Цитировать
что и не получается сделать...

А более полезное описание проблемы есть?


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: dercas от Декабрь 03, 2012, 16:10
Цитировать
что и не получается сделать...

А более полезное описание проблемы есть?

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


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: mutineer от Декабрь 03, 2012, 16:42
Что значит "не получается"? Не можешь набрать, потому что клавиатура не работает? Не собирается? Вылетает? Пустой хеш получается?


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: dercas от Декабрь 03, 2012, 17:35
Что значит "не получается"? Не можешь набрать, потому что клавиатура не работает? Не собирается? Вылетает? Пустой хеш получается?
Не получается, потому что не знаю как сделать. Несколько дней искал ответ в гугле, но безрезультатно


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: carrygun от Декабрь 04, 2012, 05:22
Может лучше будет QHash<QString, QPair<QString, ServerSocket*> >? Потом можно будет по имени канала достать всех пользователей.


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: Igors от Декабрь 04, 2012, 13:35
Я также не понял что же не получается у автора темы  :)
Код:
QHash<QString, ServerSocket *> nick_list;
nick_list.insert(nick, socket);
Код:
  
QMultiHash<QString, QHash<QString, ServerSocket *>* > channel_list;
channel_list.insert(name_channel, &nick_list);
Если понимать это как рабочий код - то локальный nick_list будет удален и указатель в channel_list станет невалиден. Ну может это для примера - хз

Конструкция "хеш на хеш" почти всегда неудачна/неудобна


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: dercas от Декабрь 07, 2012, 11:14
пробую использовать QMap< QString, QMap<QString, const QString *> > map;

Код:
  
  QHash<QString, ServerSocket *> nick_list;
  nick_list.insert(nick, socket);


//Функция:
  QHash<QString, ServerSocket *>::iterator i = peers.find(nick);
  const QString *temp = &i.key();
  map[ nam ][ p ] = &i.key();

Пытаюсь передать в map ссылку на ключ, который в QHash. В temp ссылка вроде заносится, как видно на рисунке. А в map нет.
Если передавать ссылку не на ключ, а на сокет, то работает.
Сильно не ругайте, с qt мало знаком..


Название: Re: QHash<QString, QHash<QString, ServerSocket *>* >
Отправлено: Igors от Декабрь 07, 2012, 15:49
Код:
  
  QHash<QString, ServerSocket *>::iterator i = peers.find(nick);
  const QString *temp = &i.key();
1) А если find выдаст end() ?
2) Откуда уверенность что адрес key() никогда не изменится? QHash может перераспределить элементы и указатель в map станет невалидным. Храните в контейнерах лишь те указатели что железно не изменятся, напр QWidget *, ServerSocket *

Сильно не ругайте, с qt мало знаком..
Вы говорите внятно где проблема, а то "не работает", а что - хз. Это неясно из Ваших постов, а когда Вас спросили - не ответили.