Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Gelöschter Benutzer
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
for (map<string, list<string>>::iterator iter = pInfo->serverScripts.begin(); iter != pInfo->serverScripts.end(); ++iter) { string strFilter = iter->first; TiXmlElement FilterElement ("Filter"); FilterElement.SetAttribute("name", strFilter.c_str()); ServerElement.LinkEndChild(&FilterElement); for (list<string>::iterator it = iter->second.begin(); it != iter->second.end(); ++it) { string strSource = *it; TiXmlElement ScriptElement ("script"); ScriptElement.SetAttribute("src", strSource.c_str()); FilterElement.LinkEndChild(&ScriptElement); } } doc.SaveFile(m_strPath.c_str()); |
Gelöschter Benutzer
unregistriert
Zitat von »CodingCat«
TinyXML 1 hat hierfür InsertEndChild. Die Methode kopiert das übergebene Element intern und übernimmt die Speicherverwaltung für dich, deine temporären Objekte kannst du dann einfach verfallen lassen.
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<Project name="SampleProject" description="This is a sample project" author="Me" version="1.0"> <Server> <Filter name="Economy"> <script src="server1.lua" /> <script src="server2.lua" /> </Filter> </Server> <Client> <Filter name="Economy"> <script src="client1.lua" /> <script src="client2.lua" /> </Filter> </Client> </Project> |
Zitat von »dot«
Erklär mal genauer, wieso du die Objekte am Heap anlegen musst, das wird mir aus obiger Erklärung nicht ganz klar.
Zitat von »Schorsch«
Ansonsten kannst du ja konkrete Fragen stellen.
C-/C++-Quelltext |
|
1 |
unique_ptr<TiXmlElement> pFilterElement(new TiXmlElement("Filter")); |
Zitat
Zitat von »CodingCat«
TinyXML 1 hat hierfür InsertEndChild. Die Methode kopiert das übergebene Element intern und übernimmt die Speicherverwaltung für dich, deine temporären Objekte kannst du dann einfach verfallen lassen.
Wenn ich InsertEndChild benutze, wird nur das erste Element in die XML-Datei geschrieben und alle anderen Unterelemente ignoriert. Laut Dokumentation fügt InsertEndChild auch ein Kindelement nach dem Element, welches übergiben wird, ein. An der Stelle habe ich mich vielleicht etwas unklar ausgedrückt.
Meine XML-Datei soll bspw. folgendermaßen aussehen:
Quellcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <Project name="SampleProject" description="This is a sample project" author="Me" version="1.0"> <Server> <Filter name="Economy"> <script src="server1.lua" /> <script src="server2.lua" /> </Filter> </Server> <Client> <Filter name="Economy"> <script src="client1.lua" /> <script src="client2.lua" /> </Filter> </Client> </Project>
Wenn ich LinkEndChild benutze, erhalte ich dieses Ergebnis auch.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
for (map<string, list<string>>::iterator iter = pInfo->serverScripts.begin(); iter != pInfo->serverScripts.end(); ++iter) { TiXmlNode *FilterNode; { TiXmlElement FilterElement ("Filter"); FilterElement.SetAttribute("name", iter->first.c_str()); // Zeiger auf das _eingefügte_ Element speichern und benutzen, // NICHT das temporäre Element mit Kindern befüllen FilterNode = ServerElement.InsertEndChild(FilterElement); } for (list<string>::iterator it = iter->second.begin(); it != iter->second.end(); ++it) { string strSource = *it; TiXmlElement ScriptElement ("script"); ScriptElement.SetAttribute("src", strSource.c_str()); FilterNode->InsertEndChild(ScriptElement); } } doc.SaveFile(m_strPath.c_str()); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
for (map<string, list<string>>::iterator iter = pInfo->serverScripts.begin(); iter != pInfo->serverScripts.end(); ++iter) { TiXmlElement FilterElement ("Filter"); FilterElement.SetAttribute("name", iter->first.c_str()); for (list<string>::iterator it = iter->second.begin(); it != iter->second.end(); ++it) { string strSource = *it; TiXmlElement ScriptElement ("script"); ScriptElement.SetAttribute("src", strSource.c_str()); // Temporäres Element mit Kindern befüllen FilterElement.InsertEndChild(ScriptElement); } // Temporäres Element erst NACH dem Befüllen mit Kindern in das Dokument einfügen ServerElement.InsertEndChild(FilterElement); } doc.SaveFile(m_strPath.c_str()); |
Zitat
Zitat von »Schorsch«
Ansonsten kannst du ja konkrete Fragen stellen.
Das werde ich jetzt auch tun
Undzwar habe ich den Smartpointer jetzt so definiert:
C-/C++-Quelltext
1 unique_ptr<TiXmlElement> pFilterElement(new TiXmlElement("Filter"));
Wie aber lege ich jetzt den "Besitzer" fest?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
unique_ptr<TiXmlElement> longLiveThefilterElement; { // Filter-Element wird bei Verlassen des Geltungsbereichs automatisch zerstört unique_ptr<TiXmlElement> filterElement(new TiXmlElement("Filter")); // Durch Verschieben in ein anderes unique_ptr-Objekt lässt sich die automatische Zerstörung // auf einen anderen Zeitpunkt verschieben, nämlich den des neuen unique_ptr-Objekts. longLiveThefilterElement = std::move(filterElement); // Achtung, der filterElement-Zeiger in diesem Geltungsbereich ist nach dem Verschieben ungültig // Jetzt lebt das Filter-Element so lange, bis longLiveThefilterElement zerstört wird, // insbesondere wird es nicht mehr bei Verlassen dieses Geltungsbereichs zerstört } // Filter-Element lebt in longLiveThefilterElement weiter ... |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
vector<unique_ptr<TiXmlElement>> manyFilterElements; { // Filter-Element konstruieren, initialisieren ... unique_ptr<TiXmlElement> filterElement(new TiXmlElement("Filter")); // Filter-Element in den Container verschieben (danach ist der vector der "Besitzer") manyFilterElements.push_back( std::move(filterElement) ); // Achtung, der filterElement-Zeiger in diesem Geltungsbereich ist nach dem Verschieben ungültig } // Filter-Element lebt in manyFilterElements weiter ... |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CodingCat« (26.10.2012, 13:51)
Gelöschter Benutzer
unregistriert
Werbeanzeige