LINUX.ORG.RU

Копия QList по ссылке

 ,


0

2

Я слаб в C++, поэтому не могу понять следующего.

Мне нужно сделать конструктор копирования, в котором нужно сделать глубокую копию QList

// Обычный конструктор
AttachTableData::AttachTableData()
{
  attachTable=new QList< Attach >();
}


// Конструктор копирования
AttachTableData::AttachTableData(AttachTableData &obj) 
{
  attachTable=new QList< Attach >();
  
  // Нужно скопировать данные из obj->attachTable в attachTable
}


Я могу конечно скопировать QList поэлементно, но хотелось бы понять как копировать одной командой.

★★★★★

Емнип там copy on write, просто присваиваешь его другому объекту QList, и при первой записи сделается глубокая копия.

anonymous
()
attachTable=new QList< Attach >(oldList);

Для кого CoW придумали, мать вашу?

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

Емнип там copy on write, просто присваиваешь его другому объекту QList, и при первой записи сделается глубокая копия.

В том то и дело, что я смотрю на доку, и там написано именно про объект QList.

А у меня ссылка на объект (attachTable=new QList< Attach >();) . Присвоить я могу не сам объект, а ссылку на него. Но будет ли при этом создаваться глубокая копия, пусть и copy on write?

Xintrea ★★★★★
() автор топика
#include <QList>
#include <QDebug>

void tst( QList<int> &arg )
{
    arg = QList<int>{ 0, 1, 2, 3 };
}

int main()
{
    QList<int> list = { 3, 2, 1 };
    qDebug() << list;
    tst( list );
    qDebug() << list;
}
KblCb ★★★★★
()

attachTable=new QList< Attach >();

attachTable должен быть не QList<Attach>*, а просто QList<Attach>. Насчет копии - у QList есть незадокументированный метод detach. Просто делаешь копирование и вызываешь этот метод для копии.

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

Это конечно, если ты точно уверен, что CoW не для тебя.

anonymous
()

Зачем? Чем тебя не устраивает CoW?
Если совсем приспичило позаниматься ненужным извращением одной строчкой, можно попробовать что-то вроде этого (код не проверял, но нечто подобное должно работать):

std::copy(obj.begin(), obj.end(), std::back_inserter(attachTable));

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

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

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

Ну да, я именно это и имел в виду. В объекте хранится указатель на данные. При создании копии объекта должна создаться и копия данных.

Другими словами, в копии объекта указатель должен указывать на копию данных.

Надеюсь, понятно написал.

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

При создании копии объекта должна создаться и копия данных

А это уже проблема не списка, а конструктора копирования твоего объекта.

anonymous
()
Ответ на: комментарий от Xintrea

тогда пиши свою реализацию, т.к. это не типичная логика. Пробегать по всем и выделять память. Или же ты можешь реализовать конструктор копирования у Attach, который будет выделять память и создавать объекты, а не просто копировать указатель, и тогда можно будет просто копировать лист через cow.

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