У меня есть объект который иногда мне нужно будет скопировать в другой. если быть точнее, то у меня в классе client_t
есть 3 одинаковых объекта, один текущая страница, второй предыдущая (если есть) и следующая (если есть). Так сказать микро оптимизация для ускорения отображения.
Встал вопрос о копировании данных из одного в другой (или же перемещение).
Т.е. загружаем следующую страницу (не ту что в кеше, а ту на которую ссылается QUrl
из кеша следующей), и перед загрузкой, нужно так сказать сдвинуть данные влево, переместить то что на текущей, на предыдущую, то что на следующей переместить на текущую, а то что было на предыдущей, просто сделать discard
, это уже реализовано, однако, допустим в объекте response_t
есть QList<material_t>
, для которого при копировании я вызываю конструктор копирования:
response_t::response_t(response_t const ©) :
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 ©) :
m_id_{copy.m_id_},
m_type_{copy.m_type_},
m_link_{copy.m_link_},
...
{
}
Так же в этом классе есть объекты, у которых тоже есть конструкторы копирования, и я не понимаю, а нужны ли они мне?
Могу ли я просто вызвать конструктор копирования у QList
или же я все правильно делаю и мне нужно везде в связанных объектах реализовать конструкторы копирования?
Я бы пошел другим путем, типа такого:
#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] следующая страницы, если они есть. При чтении не забудьте добавить проверку количества объектов в листе. Таким образом вы сможете легко расширить количество сохраняемых страниц, если будет необходимо.
Надеюсь я правильно понял задачу, так как описание немного не полное.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я работаю на C#, но полагаю, это касается любого языка использующий объектно - ориентированную парадигму
Есть класс Circle, который рисует окружности заданного размераЯ попытался сделать событие на клик мыши, которое показывало бы информацию по данному...
Нужно вызывать функцию каждый определённый n-ый промежуток времени
Есть таблица authors со столбцами fio, count, urlВсе данные загружаются в datagridview (столбец с ID тоже, но он не отображается на форме)