Eigene Klasse von QDomElement ableiten
-
Hi,
ich möchte das QDomElement um ein paar Funktionen erweitern:
class cMyDom : public QDomElement { public: cMyDom getSpecialChild(); } cMyDom cMyDom::getSpecialChild() { return this->firstChildElement("ABC"); } cMyDom myDom; myDom = myDom.getSpecialChild().getSpecialChild();
Das funktioniert so natürlich nicht, weil der Rückgabewert von firstChildElement ein QDomElement ist. Was muss ich tun, damit ich so etwas implementieren kann?
Hab übrigens versucht den =-Operator zu überladen, dann steh ich aber vor dem Problem, dass ich die zugewisenen Daten nicht in mein "this" bekomm...
PS: Folgendes gibt bei mir 1 aus:
QDomDocument doc; doc.setContent(&xmlFile); cMyDom x = doc.toElement(); cout << c.isNull() << endl;
-
edit: Hmm, ich glaub ich hätte vorher erstmal fragen sollen was genau du vor hast und warts mit dem Code ab.
Um was für eine Funktion willst du die Klasse erweitern? Bzw. was genau soll die denn machen?
-
Warum willst du QDomElement erweitern?
Mach doch einfach eine eigene Klasse "MyDomHelper" (nicht von QDomElement ableiten) und implementiere Hilfsfunktionen:
QDomElement MyDomHelper::getSpecialChild( QDomElement &element ) { return element.firstChildElement("ABC"); }
Aufruf dann so:
MyDomHelper helper; QDomElement specialchild = helper.getSpecialChild( doc.toElement() );
-
Ich möchte vor allem die firstChildElement() Methode dahin erweitern, dass ein Aufruf meiner Methode direkt zu einem vordefinierten Punkt in meiner Baumstruktur springt. Eine zweite Methode möchte ich verwenden, um ein Child zu suchen, das wiederum ein bestimmtes Child mit einem bestimmten Wert enthält. Und mit der Vererbung möchte ich arbeiten, weil ich zum einen trotzdem die QDomElement-Methoden verwenden möchte und weil ich meine Methoden gerne verketten möchte ala myMethod().myMethod2().myMethod().
Ich weiß ja nicht, ob das hilft, aber ich hatte ja daran gedacht, den =-Operator zu überladen, damit ich ein zugewiesenes DomElement in mich selbst hineinkopiere. Aber das hab ich nicht auf die Reihe gekriegt...
-
Deine Wünsche in Ehren, aber du solltest nicht versuchen, dein Design an Bequemlichkeit oder syntaktischen Wünschen aufzuhängen, vor allem wenn sie in ein komplexes System integriert werden sollen.
Es gibt in den ganzen DOM-Klassen von Qt so viele Methoden, die ein QDomElement zurückgeben oder in eines konvertiert werden können. Das heißt, du musst im Prinzip jede einzelne Klasse (QDomNode, QDomElement, QDomDocument, ...) ableiten, die entsprechenden Methoden neu implementieren. Das wiederum bedeutet, dass auch alle Methoden, die ein QDomNode usw. zurückgeben, an deine Bedürfnisse angepasst werden müssen (Nur wg. einem return-Typ...).
Das nächste Problem: Deine myDomElement-Klasse macht nur bei einem QDomElement Sinn, das gewisse Vorbedingungen erfüllt, was die children betrifft. Wie willst du das lösen?Merkst du was? Das wird ein verdammt großer Aufwand, der mehr Zeit in Anspruch nehmen wird (und vor allem viele Probleme produzieren wird!!!) als du jemals bei der Verwendung sparen wirst.
Schreib dir also (wie Softwaremaker empfohlen hat) eine Klasse DomElementHandler, oder arbeite gleich mit freien Funktionen, oder (noch besser) kapsel die Methoden in einer Klasse weg, die mit dem XML-Doc tatsächlich arbeitet, so dass der Benutzer gar nicht mitbekommt, dass im Hintergrund was mit XML läuft.
-
Naja, im Rahmen meiner Anwendung macht das schon Sinn. mit QDomElement kann ich ja alle beliebigen XML Dokumente behandeln. Ich hab aber eine vorgegebene XML Struktur, die immer gleich sein muss. Und in dieser Struktur möchte ich immer gleiche Operationen ausführen, also immer auf die gleichen Elemente zugreifen, die über Childs definiert werden. Die XML Struktur liegt übrigens nicht in meiner Hand.
Inzwischen klappt mein Handling sogar, ich musste nur eine kleine Änderung beim Parsen machen (QDomDocument lässt sich eben nicht in ein QDomElement umwandeln
).
Da ich ja von QDomElement ableite, sollte es mit den anderen Klassen eigentlich keine Probleme geben, oder? Und da ich keine Eigenschaften hinzufüge, klappt auch die Zuweisung cMyDom = QDomElement.