NullReferenz da Konstruktorbefehle in falscher Reihenfolge abgearbeitet werden?



  • Physikalischer Fehler schrieb:

    Ldann gibt es die Exception, denn Setup_Text() benötigt Daten aus dem noch nicht konstruierten CXmlRead Objekt...Was kann ich nun machen?

    Wie bitte soll Setup_Text denn an dieses Objekt überhaupt herankommen? Das ist nur eine lokale Variable, und übergeben wird sie auch nicht.



  • Ich nehme an du schreibst sowas wie

    CppForm form = new CppForm()
    

    Dein CXmlRead stößt spätestens da auf die null, wo es die Variable form benutzt, denn form wird erst zugewiesen, wenn die rechte Seite der Zuweisung (der Konstruktor) vollständig ausgewertet ist.



  • @estartu: Wie C# und .NET sieht mir das aber nicht aus 😉



  • LordJaxom schrieb:

    @estartu: Wie C# und .NET sieht mir das aber nicht aus 😉

    Sondern?



  • Was weiss denn ich 😕

    Jedenfalls gibts in C# keine Pointer und .NET Klassen beginnen nicht mit dem "C". Und die .NET Klasse XmlReader lässt sich nicht direkt instantiieren 🙂



  • hä schrieb:

    Sondern?

    wie c++ und .net



  • Bashar schrieb:

    wie c++ und .net

    Vermutlich ne Mischung aus managed C++ und unsafe Code darin.. (Stellt sich die Frage warum der XML-Parser unmanaged sein muss 😉 )



  • MFK schrieb:

    Physikalischer Fehler schrieb:

    Ldann gibt es die Exception, denn Setup_Text() benötigt Daten aus dem noch nicht konstruierten CXmlRead Objekt...Was kann ich nun machen?

    Wie bitte soll Setup_Text denn an dieses Objekt überhaupt herankommen? Das ist nur eine lokale Variable, und übergeben wird sie auch nicht.

    Setup_Text() ist eine Klassenmethode von CppForm, ebenso ist eine Variable vom Typ CXmlRead *xmlr im Public Bereich der Klasse CppForm vorgesehen. Am Anfang habe ich den Konstruktor zu CppForm gepostet und in diesem wird mittels

    CXmlRead *xmlr = new CXmlRead(S"config.xml");
    

    dem CXmlRead Objekt ja ein Wert zugewiesen (und der Konstruktor für CXmlRead- Objekte aufegrufen). In Folge dessen sollte Setup_Text() damit arbeiten können.

    Für die anderen: Ja, es ist managed C++ und dass Kapseln einiger XML- Parser Funktionen kann durchaus sinnvoll sein.



  • Physikalischer Fehler schrieb:

    Setup_Text() ist eine Klassenmethode von CppForm, ebenso ist eine Variable vom Typ CXmlRead *xmlr im Public Bereich der Klasse CppForm vorgesehen. Am Anfang habe ich den Konstruktor zu CppForm gepostet und in diesem wird mittels

    CXmlRead *xmlr = new CXmlRead(S"config.xml");
    

    dem CXmlRead Objekt ja ein Wert zugewiesen

    Nein. Du deklarierst im Konstruktor eine neue, lokale Variable, die genauso heißt die die Membervariable. Dadurch wird die Membervariable verdeckt und bleibt uninitialisiert. Lass das CXmlRead * in dieser Zeile weg, dann arbeitest du mit der Membervariablen.



  • Stimmt, ich hab das wohl verpeilt. Danke.



  • Rein Interessehalber:

    Was wird denn da nun gecodet? Managed C++ zusammen mit irgendeiner Unmanaged XML-Bibliothek?



  • Managed C++ und das CXmlRead Zeug benutzt in seinen eigenen Methoden die Managed XML Parser.


Anmelden zum Antworten