Russian Qt Forum

Программирование => С/C++ => Тема начата: Nimbus от Апрель 07, 2010, 06:58



Название: Как скопировать память объекта?
Отправлено: 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));
...
 
? Но это не есть гуд... Как быть в такой ситуации?


Название: Re: Как скопировать память объекта?
Отправлено: lit-uriy от Апрель 07, 2010, 07:25
>>Но это не есть гуд... Как быть в такой ситуации?
Ну можнож написать функцию один раз и затем её использовать сколько угодно раз.


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


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

Если не поможет, то можно, без игр с памятью, создать новый объект и просто установить ему нужные свойства вызовами соотв. методов (долгий способ конечно).


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

Если не поможет, то можно, без игр с памятью, создать новый объект и просто установить ему нужные свойства вызовами соотв. методов (долгий способ конечно).
А с чего это должно помочь?) Объект-то как бы всё равно один останется. Указатель на указатель. Дублирующего-то объекта не будет.
Я просто думал, что мб есть какая-то уже готовая функция...


Название: Re: Как скопировать память объекта?
Отправлено: voronElf от Апрель 07, 2010, 09:43
ммм ...
там указатели сначала разименовываются и операция идет присваивание для самих объектов а не указателей.

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

а вот присваивание того, на что эти указатели указывают:
Код:
*view = *original;


Название: Re: Как скопировать память объекта?
Отправлено: Nimbus от Апрель 07, 2010, 12:30
Ой гоню)
Результат будет как и у memcpy.
Скопируется объект, а также все его поля, том числе и указатели на другие объекты. Ну а как же с ними-то быть? Ведь должны тогда и в памяти создаться копии этих объектов уже с другими адресами. % )
Вот я и спрашиваю, есть ли универсальная функция какая-нибудь, которая не просто скопирует этот объект, а также и объекты на которые ссылаются поля-указатели этого класса и присвоит этим полям новые указатели.


Название: Re: Как скопировать память объекта?
Отправлено: lit-uriy от Апрель 07, 2010, 12:33
voronElf, у всех наследников QWidget отсутствует и конструктор копирования и оператор присваивания.

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

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

вот тут тема поднималась (http://www.forum.crossplatform.ru/index.php?showtopic=2567&view=findpost&p=18354)


Название: Re: Как скопировать память объекта?
Отправлено: Nimbus от Апрель 07, 2010, 13:04
Я не говорю, что класс объекта обязательно наследуется от QWidget или QObject. Я говорю о традиционном C++. Не зря же я именно в этом разделе тему создал.
Можно ли как-то пробежаться циклом по всем полям класса и определить, является ли это поле указателем на какой-либо объект? Если да, то определить какого класса этот объект?


Название: Re: Как скопировать память объекта?
Отправлено: lit-uriy от Апрель 07, 2010, 13:16
>>Можно ли как-то пробежаться циклом по всем полям класса
для этого потребуется знать какие есть поля у класса, а С++ не предоставляет метаинформацию. Как в новом стандарте не знаю, но по моему тоже нет.


Название: Re: Как скопировать память объекта?
Отправлено: Nimbus от Апрель 07, 2010, 13:25
Плохо... >.<


Название: Re: Как скопировать память объекта?
Отправлено: Igors от Апрель 07, 2010, 16:37
А с чего это должно помочь?) Объект-то как бы всё равно один останется. Указатель на указатель. Дублирующего-то объекта не будет.
Будет. memcpy не проходит при работе с объектами, нужно использовать оператор присваивания или конструктор копирования. Qt может шерить какие-то данные при копировании (shallow copy) но это детали реализации - копия полноценна. Др. дело что эти оператор и/или конструктор может быть private для конкретного класса - это значит такие объекты копировать нельзя.


Название: Re: Как скопировать память объекта?
Отправлено: mozgofil от Апрель 18, 2010, 18:45
? Но это не есть гуд... Как быть в такой ситуации?
если копирование объекта данного типа не предусмотрено в Qt (не определён конструктор клпирования),
то нефиг этим заниматься, ибо это хак!!!
возможно тебе хватит простого  копирования св-в?


Название: Re: Как скопировать память объекта?
Отправлено: Nimbus от Апрель 21, 2010, 07:19
Да мне-то хватит в принципе и такого. Просто я был уверен, что можно обойтись без лишнего линейного кода.


Название: Re: Как скопировать память объекта?
Отправлено: Tonal от Апрель 21, 2010, 11:05
2 Nimbus Может быть ты просто что-то не так делаешь?
Если уж тебе оказываются нужны вещи которых идеологически нет во фреймворке...
Ведь QWebView - это отображалка.
Может есть другие пути решения твоей проблемы?
Например изменять саму страницу - её элементы?