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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как скопировать память объекта?  (Прочитано 8769 раз)
Nimbus
Гость
« : Апрель 07, 2010, 06:58 »

Доброго времени суток. В традиционном C++ я начинающий, так что прошу не бить палками за тупые вопросы.
Вопрос такой:
Как создать дубликат объекта QWebView в памяти, чтоб можно было с ним делать что угодно, при этом эти изменения не касались бы оригинального объекта?
Вот простое
Код
C++ (Qt)
QWebView *view = new QWebView;
memcpy(view, original, sizeof(QWebView));
 
не канает, потому что в объекте, помимо данных содержатся прямые указатели на объекты QWebPage, а в нём уже указатель на объект QWebFrame. Как создать полностью дублирующие объекты из тех, на которые ссылаются эти указатели? Неужели придётся ещё дописывать что-то типа:
Код
C++ (Qt)
QWebView *view = new QWebView;
memcpy(view, original, sizeof(QWebView));
QWebPage *page = new QWebPage;
memcpy(page, original->page(), sizeof(QWebPage));
view->setPage(page);
QWebFrame *frame = (QWebFrame*)malloc(sizeof(QWebFrame));
...
 
? Но это не есть гуд... Как быть в такой ситуации?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 07, 2010, 07:25 »

>>Но это не есть гуд... Как быть в такой ситуации?
Ну можнож написать функцию один раз и затем её использовать сколько угодно раз.
Записан

Юра.
Nimbus
Гость
« Ответ #2 : Апрель 07, 2010, 07:28 »

>>Но это не есть гуд... Как быть в такой ситуации?
Ну можнож написать функцию один раз и затем её использовать сколько угодно раз.
Причём здесь функция? А если в объекте содержится неизвестное количество указателей на другие объекты? Или писать как индусы?
Я имею ввиду, возможно ли создать дубликат объекта в памяти и объектов, на которые в нём есть указатели. В тех же объектах могут быть ещё указатели на объекты. Так что, я думаю тут будет что-то типа дерева, в котором без рекурсии не обойтись.
Записан
voronElf
Гость
« Ответ #3 : Апрель 07, 2010, 07:51 »

В принципе если это реализовано, то при переопределении операции присваивания класса. Не знаю, сделали ли разработчики Qt это переопределение, а если сделали то как поступили с агрегированными по ссылке объектами. Проверь:
Код:
QWebView *view = new QWebView;
*view = *original;

Если не поможет, то можно, без игр с памятью, создать новый объект и просто установить ему нужные свойства вызовами соотв. методов (долгий способ конечно).
Записан
Nimbus
Гость
« Ответ #4 : Апрель 07, 2010, 08:44 »

В принципе если это реализовано, то при переопределении операции присваивания класса. Не знаю, сделали ли разработчики Qt это переопределение, а если сделали то как поступили с агрегированными по ссылке объектами. Проверь:
Код:
QWebView *view = new QWebView;
*view = *original;

Если не поможет, то можно, без игр с памятью, создать новый объект и просто установить ему нужные свойства вызовами соотв. методов (долгий способ конечно).
А с чего это должно помочь?) Объект-то как бы всё равно один останется. Указатель на указатель. Дублирующего-то объекта не будет.
Я просто думал, что мб есть какая-то уже готовая функция...
Записан
voronElf
Гость
« Ответ #5 : Апрель 07, 2010, 09:43 »

ммм ...
там указатели сначала разименовываются и операция идет присваивание для самих объектов а не указателей.

вот присваивание указателей:
Код:
view = original;

а вот присваивание того, на что эти указатели указывают:
Код:
*view = *original;
Записан
Nimbus
Гость
« Ответ #6 : Апрель 07, 2010, 12:30 »

Ой гоню)
Результат будет как и у memcpy.
Скопируется объект, а также все его поля, том числе и указатели на другие объекты. Ну а как же с ними-то быть? Ведь должны тогда и в памяти создаться копии этих объектов уже с другими адресами. % )
Вот я и спрашиваю, есть ли универсальная функция какая-нибудь, которая не просто скопирует этот объект, а также и объекты на которые ссылаются поля-указатели этого класса и присвоит этим полям новые указатели.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Апрель 07, 2010, 12:33 »

voronElf, у всех наследников QWidget отсутствует и конструктор копирования и оператор присваивания.

>>Причём здесь функция?
>>А если в объекте содержится неизвестное количество указателей на другие объекты?
>>Или писать как индусы?
представления не имею как пишут индусы. Но для каждого класса ты всё равно будешь писать индивидуальный код.

Если ограничиться только классам Qt, то поможет метаинформация и прочие возможность QObject.

вот тут тема поднималась
« Последнее редактирование: Апрель 07, 2010, 12:42 от lit-uriy » Записан

Юра.
Nimbus
Гость
« Ответ #8 : Апрель 07, 2010, 13:04 »

Я не говорю, что класс объекта обязательно наследуется от QWidget или QObject. Я говорю о традиционном C++. Не зря же я именно в этом разделе тему создал.
Можно ли как-то пробежаться циклом по всем полям класса и определить, является ли это поле указателем на какой-либо объект? Если да, то определить какого класса этот объект?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Апрель 07, 2010, 13:16 »

>>Можно ли как-то пробежаться циклом по всем полям класса
для этого потребуется знать какие есть поля у класса, а С++ не предоставляет метаинформацию. Как в новом стандарте не знаю, но по моему тоже нет.
Записан

Юра.
Nimbus
Гость
« Ответ #10 : Апрель 07, 2010, 13:25 »

Плохо... >.<
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Апрель 07, 2010, 16:37 »

А с чего это должно помочь?) Объект-то как бы всё равно один останется. Указатель на указатель. Дублирующего-то объекта не будет.
Будет. memcpy не проходит при работе с объектами, нужно использовать оператор присваивания или конструктор копирования. Qt может шерить какие-то данные при копировании (shallow copy) но это детали реализации - копия полноценна. Др. дело что эти оператор и/или конструктор может быть private для конкретного класса - это значит такие объекты копировать нельзя.
Записан
mozgofil
Гость
« Ответ #12 : Апрель 18, 2010, 18:45 »

? Но это не есть гуд... Как быть в такой ситуации?
если копирование объекта данного типа не предусмотрено в Qt (не определён конструктор клпирования),
то нефиг этим заниматься, ибо это хак!!!
возможно тебе хватит простого  копирования св-в?
Записан
Nimbus
Гость
« Ответ #13 : Апрель 21, 2010, 07:19 »

Да мне-то хватит в принципе и такого. Просто я был уверен, что можно обойтись без лишнего линейного кода.
Записан
Tonal
Гость
« Ответ #14 : Апрель 21, 2010, 11:05 »

2 Nimbus Может быть ты просто что-то не так делаешь?
Если уж тебе оказываются нужны вещи которых идеологически нет во фреймворке...
Ведь QWebView - это отображалка.
Может есть другие пути решения твоей проблемы?
Например изменять саму страницу - её элементы?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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