Название: Передача статического итератора в метод
Отправлено: 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'
Название: Re: Передача статического итератора в метод
Отправлено: blood_shadow от Сентябрь 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
Название: Re: Передача статического итератора в метод
Отправлено: Igors от Сентябрь 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; };
Название: Re: Передача статического итератора в метод
Отправлено: dsp от Сентябрь 25, 2011, 21:42
Возможно, у меня не правильный взгляд на реализацию, алгоритм которой описан ниже: - В два QMap<QString, QString> загружаются из файлов слова (как в словаре, в один QMap слово-перевод, в другой перевод-слово);
- Пользователь выбирает порядок отображения (слово-перевод или перевод-слово);
- Если был выбран режим "слово-перевод", в слот передается статический итератор на первый QMap;
- Пользователь пишет перевод на отображенное слов, если ответ верный, то ++iterator;
- Закончив, пользователь может выбрать другой режим, тогда надо передать итератор на второй QMap.
PS: если требуется, то могу выложить код полностью (будет полезно, если мене дадут пару дельных советов, как писать код лучше).
Название: Re: Передача статического итератора в метод
Отправлено: Igors от Сентябрь 26, 2011, 08:34
Никаких "страшных ошибок" Вы не допустили, просто "технически" это можно сделать лучше. Зачем делать итератор(ы) статическими и писать километры в параметрах? Это длинно, неудобно и негибко. Простой вариант передать сам QMap (по указателю или ссылке) + ключ с которого начинать, а слот уже возьмет по ключу итератор. Или более общее решение - передавать мини-класс который умеет итерировать. При этом слот может быть и не привязан к конкретной QMap. Эти решения уже были предложены выше.
|