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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача статического итератора в метод  (Прочитано 3519 раз)
dsp
Гость
« : Сентябрь 25, 2011, 17:53 »

Привет.

Есть класс с объявлением 2х статических итераторов

mainwindow.h
Код:
class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow();

private:
    static QMap<QString, QString>::iterator beginIterator;
    static QMap<QString, QString>::iterator endIterator;
};

Необходимо передавать их в слот
mainwindow.cpp
Код:
MainWindow::MainWindow()
{
     connect(this, SIGNAL(transferIteratorsOnMapSignal(QMap<QString, QString>::iterator, QMap<QString, QString>::iterator)), this, SLOT(comparisonWordsSlot(QMap<QString,QString>::iterator, QMap<QString,QString>::iterator)));
}

void MainWindow::initialIteratorsForMap()
{
    setLanguageSlot(currentItemCombo);  

    if(currentItemCombo == 0)
      emit transferIteratorsOnMapSignal(beginIterator = dictionaryNohRus.begin(), endIterator = dictionaryNohRus.end());

    else if(currentItemCombo == 1)
        emit transferIteratorsOnMapSignal(beginIterator = dictionaryRusNoh.begin(), endIterator = dictionaryRusNoh.end());
}

При компиляции выдает ошибку. Как это исправить?

Код:
In function `MainWindow::initialIteratorsForMap()':
ошибка: undefined reference to `MainWindow::endIterator'
ошибка: undefined reference to `MainWindow::beginIterator'
« Последнее редактирование: Сентябрь 25, 2011, 17:55 от dsp » Записан
blood_shadow
Гость
« Ответ #1 : Сентябрь 25, 2011, 18:50 »

Это все из-за того что ты объявил статические итераторы, но не определил
Статические переменные должны быть определены в глобальной области, до их первого использования:
Код
C++ (Qt)
 
MainWindow::beginIterator;
MainWindow::endIterator;
 
MainWindow::MainWindow()
{
    connect(this, SIGNAL(transferIteratorsOnMapSignal(QMap<QString, QString>::iterator, QMap<QString, QString>::iterator)), this, SLOT(comparisonWordsSlot(QMap<QString,QString>::iterator, QMap<QString,QString>::iterator)));
}
 
void MainWindow::initialIteratorsForMap()
{
   setLanguageSlot(currentItemCombo);  
 
   if(currentItemCombo == 0)
     emit transferIteratorsOnMapSignal(beginIterator = dictionaryNohRus.begin(), endIterator = dictionaryNohRus.end());
 
   else if(currentItemCombo == 1)
       emit transferIteratorsOnMapSignal(beginIterator = dictionaryRusNoh.begin(), endIterator = dictionaryRusNoh.end());
}
 

а вообще как мне кажется использовать таким образом статические итераторы, и тем более в коннекте такого вида:
Код
C++ (Qt)
connect(this, SIGNAL(transferIteratorsOnMapSignal(QMap<QString, QString>::iterator, QMap<QString, QString>::iterator)),
this, SLOT(comparisonWordsSlot(QMap<QString,QString>::iterator, QMap<QString,QString>::iterator)));

Плохая идея, лучше сделать сигнал и вовсе без параметров, а в ф-ции comparisonWordsSlot() справшивать
значение currentItemCombo
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 25, 2011, 21:02 »

Подача итераторов никак не хороша, но человек зарядил имя transferIteratorsOnMapSignal - возможно программирование ему нравится  Улыбающийся

Стандартный рецепт - оберточный класс, напр
Код
C++ (Qt)
typedef QMap <QString, QString> TStrMap;
struct СStrMapLookup {
СStrMapLookup( TStrMap & _map ) : mMap(_map), mBeg(_map.begin()), mEnd(_map.end()) {}
 
QString * GetCur( void ) { return (mBeg == mEnd) ? 0 : &mBeg.value(); }
QString * GetNxt( void ) { if (mBeg != mEnd) ++mBeg; return  GetCur(); }
 
// data
TStrMap & mMap;
TStrMap::iterator mBeg, mEnd;
};
 
« Последнее редактирование: Сентябрь 26, 2011, 08:21 от Igors » Записан
dsp
Гость
« Ответ #3 : Сентябрь 25, 2011, 21:42 »

Возможно, у меня не правильный взгляд на реализацию, алгоритм которой описан ниже:
  • В два QMap<QString, QString> загружаются из файлов слова (как в словаре, в один QMap слово-перевод, в другой перевод-слово);
  • Пользователь выбирает порядок отображения (слово-перевод или перевод-слово);
  • Если был выбран режим "слово-перевод", в слот передается статический итератор на первый QMap;
  • Пользователь пишет перевод на отображенное слов, если ответ верный, то ++iterator;
  • Закончив, пользователь может выбрать другой режим, тогда надо передать итератор на второй QMap.

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

« Последнее редактирование: Сентябрь 25, 2011, 21:47 от dsp » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 26, 2011, 08:34 »

Никаких "страшных ошибок" Вы не допустили, просто "технически" это можно сделать лучше. Зачем делать итератор(ы) статическими и писать километры в параметрах? Это длинно, неудобно и негибко. Простой вариант передать сам QMap (по указателю или ссылке) + ключ с которого начинать, а слот уже возьмет по ключу итератор. Или более общее решение - передавать мини-класс который умеет итерировать. При этом слот может быть и не привязан к конкретной QMap. Эти решения уже были предложены выше.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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