Конструктор копирования для QList<T>

73
30 января 2022, 10:50

У меня есть объект который иногда мне нужно будет скопировать в другой. если быть точнее, то у меня в классе client_t есть 3 одинаковых объекта, один текущая страница, второй предыдущая (если есть) и следующая (если есть). Так сказать микро оптимизация для ускорения отображения.

Встал вопрос о копировании данных из одного в другой (или же перемещение).

Т.е. загружаем следующую страницу (не ту что в кеше, а ту на которую ссылается QUrl из кеша следующей), и перед загрузкой, нужно так сказать сдвинуть данные влево, переместить то что на текущей, на предыдущую, то что на следующей переместить на текущую, а то что было на предыдущей, просто сделать discard, это уже реализовано, однако, допустим в объекте response_t есть QList<material_t>, для которого при копировании я вызываю конструктор копирования:

response_t::response_t(response_t const &copy) :
    m_time_{copy.m_time_},
    m_total_{copy.m_total_},
    m_previous_page_{copy.m_previous_page_},
    m_next_page_{copy.m_next_page_},
    m_materials_{copy.m_materials_} // это QList
{
}
material_t::material_t(material_t const &copy) :
    m_id_{copy.m_id_},
    m_type_{copy.m_type_},
    m_link_{copy.m_link_},
    ...
{
}

Так же в этом классе есть объекты, у которых тоже есть конструкторы копирования, и я не понимаю, а нужны ли они мне?

Могу ли я просто вызвать конструктор копирования у QList или же я все правильно делаю и мне нужно везде в связанных объектах реализовать конструкторы копирования?

Answer 1

Я бы пошел другим путем, типа такого:

#define STORED_PAGE_COUNT 3
class material_t
{
public:
    enum Type {
        First,
        Second
    };
    material_t(int id, Type type, QString link)
        : m_id_(id), m_type_(type), m_link_(link) {}
private:
    int m_id_{};
    Type m_type_{};
    QString m_link_{};
};
class page_t: public QObject
{
    Q_OBJECT
public:
    page_t() {}
    void addMaterial(material_t *m)
    {
        m_materials.append(m);
    }
private:
    QList<material_t *> m_materials;
};
class client_t
{
public:
    client_t() {}
    void addPage(page_t * response)
    {
        m_pages.push_back(response);
    }
    void dataRecive(const char * data)
    {
        auto * page = new page_t();
        //Parse data here like:
        int id = static_cast<int>(data[0]);
        material_t::Type type = static_cast<material_t::Type>(data[1]);
        QString link =  static_cast<QString>(data[3]);
        //
        auto * material = new material_t(id, type, link);
        page->addMaterial(material);
        if(m_pages.count() == STORED_PAGE_COUNT)
            m_pages.takeFirst()->deleteLater();
        m_pages.append(page);
    }
private:
    QList<page_t *> m_pages;
};

Естественно парсить ответ так не нужно, но по скольку я не знаю в каком формате вы получаете данные, то не могу знать как их парсить.

В m_pages у вас будет всегда [0] предыдущая, в [1] нынешняя и в [2] следующая страницы, если они есть. При чтении не забудьте добавить проверку количества объектов в листе. Таким образом вы сможете легко расширить количество сохраняемых страниц, если будет необходимо.

Надеюсь я правильно понял задачу, так как описание немного не полное.

READ ALSO
Чем плоха публичность переменных в ООП?

Чем плоха публичность переменных в ООП?

Я работаю на C#, но полагаю, это касается любого языка использующий объектно - ориентированную парадигму

161
Событие на нарисованный объект c#

Событие на нарисованный объект c#

Есть класс Circle, который рисует окружности заданного размераЯ попытался сделать событие на клик мыши, которое показывало бы информацию по данному...

87
Функция в Unity наподобие SetInterval из JavaScript

Функция в Unity наподобие SetInterval из JavaScript

Нужно вызывать функцию каждый определённый n-ый промежуток времени

172
Поиск данных через RowFilter в dataGridView по всем столбцам

Поиск данных через RowFilter в dataGridView по всем столбцам

Есть таблица authors со столбцами fio, count, urlВсе данные загружаются в datagridview (столбец с ID тоже, но он не отображается на форме)

106