Russian Qt Forum
Май 12, 2024, 07:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Копия QList по ссылке  (Прочитано 4294 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Август 13, 2015, 00:52 »

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

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

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


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

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

Собираю информацию по крупицам
http://webhamster.ru
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #1 : Август 13, 2015, 01:14 »

если правильно понял из обрывка кода, то конструктор копирования будет выглядеть так:
Код
C++ (Qt)
AttachTableData::AttachTableData(const AttachTableData &obj)
   : attachTable(obj.attachTable)
{
}
 
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Август 13, 2015, 08:18 »

почитайте про implicit и explicit sharing и этот вопрос у вас отпадет сам собой.
если в кратце - при копировании списка на самом деле копируется указатель на некие данные. и пока вы не будете ничего в нем менять (а только читать например), то ваши списки (оригинал и копия) будут ссылаться по факту на одни и теже данные.
Как только вы добавите/измените что то в одном из списков, произойдет copy-on-write - т.е. эти два списка будут ссылаться уже на разные данные. Т.е. я не вижу острой необходимости явного копирования. Все это за вас сделает в фоне Qt.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 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 (вместо указателя) было бы проще и лучше
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Август 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 дело не дойдет.
Записан

Собираю информацию по крупицам
http://webhamster.ru
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Август 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 дело не дойдет.

Передавайте в конструктор Улыбающийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 23.