Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deMax от Декабрь 07, 2015, 09:24



Название: как добавить в список класс с константными полями
Отправлено: deMax от Декабрь 07, 2015, 09:24
Код:
class A {
  const uint b;
public:
  A(uint c):b(c){}};

        QList<A> a;
        a<<A(20); // ошибка: non-static const member 'const uint A::b', can't use default assignment operator class A
Как нибудь это можно сделать? Оператор копирования по идее тоже не поможет, константы хотят в конструкторе объявления.

p.s. можно конечно проигнорить const добавив функцию, но как то все это некрасиво - ради const еще оператор копирования городить.
A& operator=(const A& other) {*(uint*)&b = other.b; return *this;}


Название: Re: как добавить в список класс с константными полями
Отправлено: Igors от Декабрь 07, 2015, 10:37
На все вопросы с константностью ответ всегда один, типа "а вы ее уберите"  :)

По смыслу какого-то легального способа быть не должно. Объявили "const" - получите проблемы с копированием, это нормально. Поэтому вместо такого (понтового) объявления лучше разрисовать геттеры/сеттеры (здесь это к месту)


Название: Re: как добавить в список класс с константными полями
Отправлено: Racheengel от Декабрь 07, 2015, 14:52
Сделайте b приватным мембером (я не люблю приваты, но это, наверное, как раз тот случай).
И проследите, чтобы никакие методы вашего класса его не меняли.


Название: Re: как добавить в список класс с константными полями
Отправлено: deMax от Декабрь 07, 2015, 16:20
Так у меня const для приватных членов класса, например size для кольцевого буфера.
p.s. для пустого оператора присваивания значение b копируется, по крайней мере оно правильное. т.е. *(uint)&b =other.b; необязательно что ли?
A &operator=(const &A other) {return *this;}


Название: Re: как добавить в список класс с константными полями
Отправлено: Igors от Декабрь 08, 2015, 05:10
Так у меня const для приватных членов класса, например size для кольцевого буфера.
Есть такая альтернатива
Код
C++ (Qt)
template <size_t buf_size>
class MyBuf {
MyBuf( void ) : m_buffer(buf_size) {}
..
};