Russian Qt Forum

Qt => Вопросы новичков => Тема начата: xintrea от Август 13, 2015, 00:52



Название: Копия QList по ссылке
Отправлено: xintrea от Август 13, 2015, 00:52
Я слаб в C++, поэтому не могу понять следующего.

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

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


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

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


Название: Re: Копия QList по ссылке
Отправлено: Johnik от Август 13, 2015, 01:14
если правильно понял из обрывка кода, то конструктор копирования будет выглядеть так:
Код
C++ (Qt)
AttachTableData::AttachTableData(const AttachTableData &obj)
   : attachTable(obj.attachTable)
{
}
 


Название: Re: Копия QList по ссылке
Отправлено: Fregloin от Август 13, 2015, 08:18
почитайте про implicit и explicit sharing и этот вопрос у вас отпадет сам собой.
если в кратце - при копировании списка на самом деле копируется указатель на некие данные. и пока вы не будете ничего в нем менять (а только читать например), то ваши списки (оригинал и копия) будут ссылаться по факту на одни и теже данные.
Как только вы добавите/измените что то в одном из списков, произойдет copy-on-write - т.е. эти два списка будут ссылаться уже на разные данные. Т.е. я не вижу острой необходимости явного копирования. Все это за вас сделает в фоне Qt.


Название: Re: Копия QList по ссылке
Отправлено: Igors от Август 13, 2015, 08:55
Код
C++ (Qt)
AttachTableData::AttachTableData(AttachTableData &obj)
{
 attachTable = obj.attachTable ? new QList< Attach >(*obj.attachTable) : 0;
 if (attachTable)   // провоцируем глубокое копирование (хз зачем)
  Q_UNUSED(attachTable->begin());
}
Впечатление что просто член QList (вместо указателя) было бы проще и лучше


Название: Re: Копия QList по ссылке
Отправлено: xintrea от Август 13, 2015, 12:20
почитайте про implicit и explicit sharing и этот вопрос у вас отпадет сам собой.
если в кратце - при копировании списка на самом деле копируется указатель на некие данные. и пока вы не будете ничего в нем менять (а только читать например), то ваши списки (оригинал и копия) будут ссылаться по факту на одни и теже данные.
Как только вы добавите/измените что то в одном из списков, произойдет copy-on-write - т.е. эти два списка будут ссылаться уже на разные данные. Т.е. я не вижу острой необходимости явного копирования. Все это за вас сделает в фоне Qt.

Вопрос в том, как синтаксически правильно прописать копирование списка, чтобы это было именно копирование.

То есть, если я пропишу:

Код:
AttachTableData::AttachTableData(AttachTableData &obj)
{
attachTable=new QList< Attach >();
attachTable=obj->attachTable;
}

То это же не будет являться копированием объекта, тут просто присвоится значение указателя, и не до никаких implicit и explicit sharing дело не дойдет.


Название: Re: Копия QList по ссылке
Отправлено: gil9red от Август 13, 2015, 12:25
почитайте про implicit и explicit sharing и этот вопрос у вас отпадет сам собой.
если в кратце - при копировании списка на самом деле копируется указатель на некие данные. и пока вы не будете ничего в нем менять (а только читать например), то ваши списки (оригинал и копия) будут ссылаться по факту на одни и теже данные.
Как только вы добавите/измените что то в одном из списков, произойдет copy-on-write - т.е. эти два списка будут ссылаться уже на разные данные. Т.е. я не вижу острой необходимости явного копирования. Все это за вас сделает в фоне Qt.

Вопрос в том, как синтаксически правильно прописать копирование списка, чтобы это было именно копирование.

То есть, если я пропишу:

Код:
AttachTableData::AttachTableData(AttachTableData &obj)
{
attachTable=new QList< Attach >();
attachTable=obj->attachTable;
}

То это же не будет являться копированием объекта, тут просто присвоится значение указателя, и не до никаких implicit и explicit sharing дело не дойдет.

Передавайте в конструктор (http://doc.qt.io/qt-4.8/qlist.html#QList-2) :)