LINUX.ORG.RU

QMapIterator как член класса

 qmapiterator,


0

1

В Qt не компилируется следующий код:

...
private:
QMap<QString,QString> colors;
QMapIterator<QString,QString> colorsIter(colors);
Видимо, такое объявление colorsIter компилятор считает функцией. Проблема в том, что никакими другими способами задать, какой QMap будет обрабатывать итератор, невозможно (или я не нашла). Попытки заменить тип в шаблоне на что-то другое,убрать (colors) и доопределить в конструкторе colorsIter ни к чему не приводят.

Как определить QMapIterator членом того же класса, что и его QMap?

оставить в покое определение и инициализировать в конструкторе?

Stil ★★★★★
()

У конструкторов есть списки инициализации, их и используйте. Кстати, у приватных членов класса лучше ставить в имени префикс m_ — это общепринятое соглашение.

MyClass::MyClass() :
    m_colorsIter(m_colors)
{
}

quiet_readonly ★★★★
()

Сделай это в списке инициализации, Люк!

KblCb ★★★★★
()
Ответ на: комментарий от trex6

А если у меня, к примеру, 4 QMap'а и 4 итератора под них?

Писать длинную, как альпинистская верёвка, строку инициализации? (Не-е-е-ед!) То есть, насколько я понимаю, QMapIterator будучи однажды созданным, не подразумевает изменение QMap'а, по которому он проходит?

GloomyArmA
() автор топика
Ответ на: комментарий от quiet_readonly

А как же верблюжий регистр?

Общепринятое - возможно, но я пока в силу малого опыта сталкивалась только с тем, что принят верблюжий регистр для имён и префикс (любой, кроме Q, по выбору) для указания на то, что класс - пользовательский. Спасибо,я посмотрю.

GloomyArmA
() автор топика

Писать длинную, как альпинистская верёвка, строку инициализации?

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

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Оффтоп: подскажите,

вам нравится тешить чувство собственного мнимого превосходства над слабым никчёмным женским полом, раз вы в курсе, что такое список инициализации и, наверное, считаете, что 4 QMap'a - это плохо спроектированный класс, поэтому не понадобится в принципе? Видно, это приятнее, чем дать правдивый ответ «я не знаю» на вопрос «как инициализировать QMapIterator».

GloomyArmA
() автор топика
Ответ на: комментарий от Stil

Ладно, уговорили %^>

Но с синхронизированным QVector'ом для перебора «Next/Prev» жрёть чуток больше, а выглядит гораздо аккуратнее...

GloomyArmA
() автор топика
Ответ на: комментарий от alex_custov

Неточно выразилась:

Не изменение самого QMap'a, а был итератор на один кумап, стал на другой. Это сферический конь в вакууме, но интересно.

GloomyArmA
() автор топика
Ответ на: комментарий от trex6

%^>

Пирожок за честность! С капустой или с картошкой?

GloomyArmA
() автор топика

Такс, не удостоятся ли первые четверо, вбросивших про списки инициализации конструктора, написать минимальный компилируемый пример?

bhfq ★★★★★
()
Последнее исправление: bhfq (всего исправлений: 1)
Ответ на: комментарий от bhfq
#include <QMap>

class Iter
{
public:
    Iter() : m_iterator( this->m_map ){};
    ~Iter() = default;

private:
    QMap<int,int>         m_map;
    QMapIterator<int,int> m_iterator;

    Iter( const Iter & ) = delete;
    Iter( Iter && ) = delete;
    Iter& operator = ( const Iter & ) = delete;
    Iter& operator = ( Iter && ) = delete;
};
KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Открываем, смотрим, присваиваем:

(без списка инициализации):

class Palette
{
public:
    Palette();
    QString  getFirstColorName(){
        colorsIter = colors;
        return colorsIter.next().value;
    }
private:
    QMap<QString,QString> colors;
    QMapIterator<QString, QString> colorsIter;
}
При компиляции получаем: no matching function for call to 'QMapIterator<QString, QString>::QMapIterator()'

Что не так?

GloomyArmA
() автор топика
Ответ на: комментарий от quiet_readonly

Кстати, у приватных членов класса лучше ставить в имени префикс m_ — это общепринятое соглашение

Только в венгерской нотации же?

f1xmAn ★★★★★
()
Ответ на: Открываем, смотрим, присваиваем: от GloomyArmA

У тебя есть конструктор, в котором инициализируются все не статические члены класса. Как ты предлагаешь инициализировать итератор?

KblCb ★★★★★
()
Ответ на: комментарий от quiet_readonly

Мне значительно больше нравится обращение ко всем членам класса через указатель на this. Значительно нагляднее.

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Сегодня ты обращаешься к членам через this в C++, завтра пишешь self в Objective-C, послезавтра покупаешь айфон, а потом сам принимаешь чл... WAIT OH SH~

Короче говоря, по-гейски оно как-то.

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от quiet_readonly

Зато не спутать локальные переменные и члены класса, а самое главное функции-члены класса и простые функции. Я понимаю, разбираться в членах это как-то по гейски, но уж такой вот язык.

KblCb ★★★★★
()
Ответ на: комментарий от annulen

Все статические языки добавляют лишний синтаксический мусор. Работа у них такая.

KblCb ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.