Frage

Ich kämpfe mit einer seltsamen Nullreferencexception, die auftritt, wenn ich versuche, ein Attribut eines Typs zu vergleichen, der von einem Matrixtyp aus dem abgeleitet ist Mathnet -Bibliothek zu nullptr.

Ich möchte eine AA C ++/CLI -Klassenbibliothek mit einer Klassenumwandlung schreiben, die aus MathNet :: Numerics :: Linearalgebra :: Matrix abgeleitet ist, die Positionen im 3D -Raum als 4x4 -Matrix in homogenen Koordinaten darstellen sollte. Weil ich in der Lage sein möchte, Positionen in Bezug auf andere Positionen festzulegen, habe ich ein Attribut Transformation^ parent. Durch if(parent == nullptr){ ... } Ich möchte testen, wenn die aktuelle Transformation einen Elternteil hat, aber ich bekomme diese Ausnahme in der Linie mit if(parent == nullptr):

An unhandled exception of type 'System.NullReferenceException' occurred in MathNet.Iridium.dll 
Additional information: Object reference not set to an instance of an object.

Meine Transformationsklasse sieht so aus:

/// Transformation.h
using namespace MathNet::Numerics::LinearAlgebra;
using namespace System;
ref class Transformation : Matrix
//ref class Transformation : A
{
public:
    Transformation(void);
    Transformation^ parent;
    void DoSomething();
};


/// Transformation.cpp
#include "StdAfx.h"
#include "Transformation.h"
Transformation::Transformation(void) : Matrix(4,4)
{
}
void Transformation::DoSomething()
{
    if(parent == nullptr)   // Produces NullReferenceException
    {
        Console::WriteLine("parent is nullptr");
    }
    Matrix^ m;
    if(m == nullptr)        // Produces NullReferenceException, too
    {
        Console::WriteLine("m is nullptr");
    }
}

Der Vergleich einer Variablen des Matrixtyps, das tatsächlich Null ist, mit nullptr scheint diese Ausnahme zu vermitteln. Wenn es ordnungsgemäß initialisiert wird, gibt es keine Ausnahme, so dass dies einwandfrei funktioniert:

Matrix^ m = gcnew Matrix(4,4);
if(m == nullptr)        // works fine
{
    Console::WriteLine("");
}

Wenn Sie die Transformation aus einer anderen Klasse ableiten, ref class Transformation : A Anstatt von ref class Transformation : Matrix, Alles funktioniert auch gut.

Und jetzt wird es wirklich komisch. Ich wollte meine Klassenbibliothek in einer C#-Anwendung verwenden. Berufung t.DoSomething() Bei einer Transformation wirft t die NullRreferencexception. Aber wenn ich den Null-Test direkt in meine C# -Anwendung einbeziehe, funktioniert er:

Transformation t = new Transformation();
// t.DoSomething();      // Throws NullReferenceException
if (t.parent == null)    // OK!
{
    Console.WriteLine("parent is null");
}

Das Gleiche in einer C ++/CLI -Anwendung wirft erneut die NullReferencexception aus:

Transformation^ t = gcnew Transformation();
// t->DoSomething();     // Throws NullReferenceException
if(t->parent == nullptr) // Throws NullReferenceException
{
    Console::WriteLine("parent is nullptr");
}

Irgendwelche Vorschläge, woher dies kommen könnte? Ich bin wirklich sehr verwirrt ...

Ich verwende das MathNet.Idirium Library, Version 2008.8.16.470

War es hilfreich?

Lösung

Es ist möglich, dass der Operator == Operator auf eine Weise implementiert wird, die eine Nullreferenz wirft.

Können Sie versuchen, Object :: ReferenceEquals (OBJ, NULL) anzurufen und zu sehen, ob dies funktioniert oder nicht?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top