NullReferenz da Konstruktorbefehle in falscher Reihenfolge abgearbeitet werden?



  • Leider bekomme ich andauernd eine SystemNullReferenceException und verstehe nicht, wieso.

    Ich habe einen Konstruktor für eine WinForms Anwendung:

    CppForm() 
    	{
    		CXmlRead *xmlr = new CXmlRead(S"config.xml");
    		Text= S"Ich bin ein Dummy";
    		folderName = S"C:\\temp";
    		FormBorderStyle::Sizable;
    		Setup_Menu();
    		Setup_Buttons();
    		Setup_Label();
    		Setup_Text();
    		}
    

    In der ersten Zeile des Konstruktors wird eine Objektreferent auf ein Objekt einer anderen Klasse erzeugt. In der Funktion Setup_Text() soll in ein Textfeld nämlich ein Wert eigentragen werden, der durch eine Methode von CXmlRead ermittelt wird.

    Dummerweise gibt es an dieser Stelle immer eine Exception, da die Methode aus CXmlRead (welche in Setup_Text aufgerufen wird) angeblich einen Null- Zeiger zurückgibt.

    Wenn ich im Debugger nun die Aufrufliste durchsehe, dann wundere ich mich sehr. Zunächst startet die App. in die main Methode, von dieser aus wird die o.g. Konstruktor Methode aufgerufen. Doch anstatt nun die im Konstruktor stehenden Methoden von oben nach Unten durchzugehen, wird zu allererste "SetupText()" ausfgerufen, dann gibt es die Exception, denn Setup_Text() benötigt Daten aus dem noch nicht konstruierten CXmlRead Objekt...Was kann ich nun machen?



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C# und .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • 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