Как изменить значение QMap или QHash элемента. Оказывается надо работать через ссылку:
class A
{
public:
A() // default ctor
{
ii=0;
//qDebug("default ctor A() ii=%i",ii);
}
A(const A&a) // copy ctor
{
ii = a.ii;
//qDebug("copy ctor A(const A&a) aa.ii=%i",ii);
}
A(int ii_) // users ctor
{
ii=ii_;
//qDebug("user ctor A(int %i)",ii);
}
~A()
{
//qDebug("dtor A~ ii=%i",ii);
}
int ii;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QHash< int , A > map;
map[1] = A(111);
map[4] = A(444);
A &aa1 =map[1];
aa1.ii = 789; // так сработает
A aa2 =map[1];
aa2.ii = 456; // так НЕ сработает, так aa2 это будет копия
qDebug("----- foreach -----");
foreach(A a, map)
qDebug("a.ii=%i", a.ii);
вывод:
----- foreach -----
a.ii=456
a.ii=444
Обращения к элементу контейнера по не существующему ключу через квадратные скобки [ ] создает новый элемент со всеми вытекающими последствиями. И [] вызывает конструктор по умолчанию.