Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > wxWidgets:wxXmlWriter не могу создать обьект


Автор: win32nipuh 22.8.2010, 12:32
Здесь описано
http://wiki.wxwidgets.org/Object_serialization_using_XTI_and_XML#wxIMPLEMENT_PROPERTY

Такой код

Код

#ifndef wxUSE_EXTENDED_RTTI
    wxLogError(wxT("NO: wxUSE_EXTENDED_RTTI"));
#else
    wxLogError(wxT("wxUSE_EXTENDED_RTTI")); // <------ пишет, что определена константа
#endif

    wxPlaylist *plist = new wxPlaylist(8);
    wxXmlDocument xml;
    wxXmlNode *root;
    root = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("root"), wxT(""));
    xml.SetRoot(root);

    wxXmlWriter writer(root); // <-- !!!!!
    wxPersister persister;
    wxVariantArray metadata;

    writer.WriteObject( plist, plist->GetClassInfo() , &persister , wxString(wxT("plist")), metadata );
    xml.Save(wxT("myXML.xml"));



Пишет

wx7Main.cpp: In member function 'void wx7Frame::OnMenuXMLLoad(wxCommandEvent&)':
wx7Main.cpp:445: error: 'wxXmlWriter' was not declared in this scope

Автор: win32nipuh 22.8.2010, 14:28
попытался перестроить всю бибилиотеку как они пишут:

wxUSE_EXTENDED_RTTI = 1

обломался процесс с ошибками.

Автор: boostcoder 22.8.2010, 15:36
опиши, что ты хочешь получить? в чем сложность?

Автор: win32nipuh 22.8.2010, 17:21
Цитата(boostcoder @ 22.8.2010,  15:36)
опиши, что ты хочешь получить? в чем сложность?

Хочу сделать сериализацию объектов своего класса в хмл файл и обратно.
Здесь описан простой пример, и все казалось бы хорошо.

http://wiki.wxwidgets.org/Object_serialization_using_XTI_and_XML#wxIMPLEMENT_PROPERTY

Я взял практически один в один этот пример(см. первый пост), добавил в свое приложение и попытался скомпилировать.
Получил ошибку, что эти классы не определены.

wxXmlWriter writer(root); // <-- !!!!!
    wxPersister persister;
    wxVariantArray metadata;


Там написано также, что эти классы работают, если wxUSE_EXTENDED_RTTI  определена.
Проверил - определена, но вроде бы напсиано.что не просто должна быть определена, но именно = 1.
Изменрил в сетуп.х - не помогло.

Похоже надо перестаривтаь видлжетовскую длл, определил =1, попытался перестроить получил кучу ошибок.
Это 2.8.11.
Вытянул 2.9.1 = вообще не смог построить, ни с этой константой, ни по умолчанию.
ЧТо за фигня ?  smile 
Оставлять 2.8.11... ладно, а сериализацию что же руками делать? кучу времени тратить на велосипед...


Автор: Amp 22.8.2010, 19:55
Цитата(win32nipuh @  22.8.2010,  14:28 Найти цитируемый пост)
попытался перестроить всю бибилиотеку как они пишут:

wxUSE_EXTENDED_RTTI = 1

обломался процесс с ошибками.

Как пересобирал, какие ошибки? 

Автор: win32nipuh 22.8.2010, 20:05
Цитата(Amp @ 22.8.2010,  19:55)
Цитата(win32nipuh @  22.8.2010,  14:28 Найти цитируемый пост)
попытался перестроить всю бибилиотеку как они пишут:

wxUSE_EXTENDED_RTTI = 1

обломался процесс с ошибками.

Как пересобирал, какие ошибки?


вот последний вариант:

2.9.1, ничего не менял, строил так (но и дебуг такой же результат)

F:\wxWidgets-2.9.1\build\msw>mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1
UNICODE=1 BUILD=release

Т.е. никак не строится 2.9.1.
Перестрою 2.8.11 с флагом разрешающим rtti, напишу лог

Автор: Amp 22.8.2010, 20:17
Попробуй без MONOLITHIC.

Автор: win32nipuh 22.8.2010, 20:49
Цитата(Amp @ 22.8.2010,  20:17)
Попробуй без MONOLITHIC.

решил постепенно повторить эксперимент, сейчас пустил 2.8.11 дебуг строиться с ртти, посмотрю
потом к 2.9.1. перейду...

Добавлено через 13 минут и 3 секунды
перестроил 2.8.11 с флагом ртти=1, пересобрал приложение, та же фигня
пишет wxLogError(wxT("wxUSE_EXTENDED_RTTI: 0")); ????

И снова пишет, что не определен wxXmlWriter  в этом контексте
Может надо не в одноv файле setup.h менять перед перестройкой?

Я менял здесь F:\wxWidgets-2.8.11_1\include\wx\msw\setup.h



Код

void wx7Frame::OnMenuXMLLoad(wxCommandEvent& event)
{
#ifndef wxUSE_EXTENDED_RTTI
    wxLogError(wxT("NO: wxUSE_EXTENDED_RTTI"));
#else
if(wxUSE_EXTENDED_RTTI==1)
    wxLogError(wxT("wxUSE_EXTENDED_RTTI: 1"));
else
    wxLogError(wxT("wxUSE_EXTENDED_RTTI: 0"));
#endif

    wxPlaylist *plist = new wxPlaylist(8);
    wxXmlDocument xml;
    wxXmlNode *root;
    root = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("root"), wxT(""));
    xml.SetRoot(root);
//
//    wxXmlWriter writer(root);
//    wxPersister persister;
//    wxVariantArray metadata;
//
//    writer.WriteObject( plist, plist->GetClassInfo() , &persister , wxString(wxT("plist")), metadata );
//    xml.Save(wxT("myXML.xml"));
}


Автор: Amp 22.8.2010, 21:36
2.9 - это вообще development ветка. Там всякое возможно. По поводу setup.h - проверь на какой setup.h ссылается проект, возможно при сборке твоей программы подхватывается совершенно другой setup.h.

Автор: Amp 22.8.2010, 22:17
Ну и xtixml.h посмотри подключен или нет. wxXmlWriter там объявлен.

Автор: win32nipuh 23.8.2010, 19:43
Цитата(Amp @ 22.8.2010,  22:17)
Ну и xtixml.h посмотри подключен или нет. wxXmlWriter там объявлен.

включил этот файл...

Но там похоже только объявление, фукнции все виртуальные...

Перенес прожект в убунту, там та же фигня, с точно такой же ошибкой....  smile 

Автор: Amp 24.8.2010, 12:10
Кстати у меня 2.9.1 ни студийным, ни gcc не собирается со включенным EXTENDED_RTTI. Предлагаю забить - все равно эта метаинформация один большой костыль, который, судя по комментариям в коде, "this is still work in progress...".

Автор: win32nipuh 24.8.2010, 18:59
Цитата(Amp @ 24.8.2010,  12:10)
Кстати у меня 2.9.1 ни студийным, ни gcc не собирается со включенным EXTENDED_RTTI. Предлагаю забить - все равно эта метаинформация один большой костыль, который, судя по комментариям в коде, "this is still work in progress...".

согласен, но в таком случае надо изобретать велосипед для сериализации объект<-> xml файл, 
причем, чтобы был совместим с виндоуз и линукс...
 smile 


сейчас проверю еще одну идею


Автор: Amp 24.8.2010, 19:25
Цитата(win32nipuh @  24.8.2010,  18:59 Найти цитируемый пост)
согласен, но в таком случае надо изобретать велосипед для сериализации объект<-> xml файл, 

Возьми boost.

Автор: win32nipuh 25.8.2010, 12:23
Цитата(Amp @ 24.8.2010,  19:25)
Цитата(win32nipuh @  24.8.2010,  18:59 Найти цитируемый пост)
согласен, но в таком случае надо изобретать велосипед для сериализации объект<-> xml файл, 

Возьми boost.

ссылку можно на boost? 
я использую CodeBloks, туда можно его впихнуть, чтобы и на вин и убунте работало?

Кстати, под вин перестроил 2.8.11 с флагом rtti - все равно пишет определана константа , но не 1... 
Такж перестроил 2.9.1 - и так и сяк - вообще не построилась, ошибки поперли  smile  ну не писец....  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)