Название: Как скопировать память объекта? Отправлено: Nimbus от Апреля 07, 2010, 06:58 Доброго времени суток. В традиционном C++ я начинающий, так что прошу не бить палками за тупые вопросы.
Вопрос такой: Как создать дубликат объекта QWebView в памяти, чтоб можно было с ним делать что угодно, при этом эти изменения не касались бы оригинального объекта? Вот простое Код не канает, потому что в объекте, помимо данных содержатся прямые указатели на объекты QWebPage, а в нём уже указатель на объект 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; Если не поможет, то можно, без игр с памятью, создать новый объект и просто установить ему нужные свойства вызовами соотв. методов (долгий способ конечно). Название: Re: Как скопировать память объекта? Отправлено: Nimbus от Апреля 07, 2010, 08:44 В принципе если это реализовано, то при переопределении операции присваивания класса. Не знаю, сделали ли разработчики Qt это переопределение, а если сделали то как поступили с агрегированными по ссылке объектами. Проверь: А с чего это должно помочь?) Объект-то как бы всё равно один останется. Указатель на указатель. Дублирующего-то объекта не будет.Код: QWebView *view = new QWebView; Если не поможет, то можно, без игр с памятью, создать новый объект и просто установить ему нужные свойства вызовами соотв. методов (долгий способ конечно). Я просто думал, что мб есть какая-то уже готовая функция... Название: 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 - это отображалка. Может есть другие пути решения твоей проблемы? Например изменять саму страницу - её элементы? |