Я борюсь со странным исключением NullReferenceException, которое возникает, когда я пытаюсь сравнить атрибут типа, производного от типа Matrix из библиотеки MathNet , с nullptr.
Я хочу написать библиотеку классов C ++ / CLI с классом Transformation, производным от MathNet :: Numerics :: LinearAlgebra :: Matrix, который должен представлять позиции в трехмерном пространстве как матрицу 4x4 в однородных координатах.Поскольку я хочу иметь возможность устанавливать позиции относительно других позиций, у меня есть атрибут Transformation^ parent
.По if(parent == nullptr){ ... }
я хочу проверить, есть ли у текущего Преобразования родитель, но я получаю это Исключение в строке с 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.
Мой класс Преобразования выглядит так:
/// 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");
}
}
Сравнение любой переменной типа Matrix, которая фактически является нулевой, с nullptr, по-видимому, выдает это исключение.Если он инициализирован должным образом, исключений нет, поэтому это прекрасно работает:
Matrix^ m = gcnew Matrix(4,4);
if(m == nullptr) // works fine
{
Console::WriteLine("");
}
Когда происходит преобразование из другого класса, ref class Transformation : A
вместо ref class Transformation : Matrix
, все тоже работает нормально.
И теперь это становится действительно странным.Я хотел использовать свою библиотеку классов в C # -приложении.Вызов t.DoSomething()
для преобразования t вызывает исключение NullReferenceException.НО, если я включаю нулевой тест непосредственно в мое приложение C #, он работает:
Transformation t = new Transformation();
// t.DoSomething(); // Throws NullReferenceException
if (t.parent == null) // OK!
{
Console.WriteLine("parent is null");
}
Если сделать то же самое в приложении C ++ / ClI, снова возникает исключение NullReferenceException:
Transformation^ t = gcnew Transformation();
// t->DoSomething(); // Throws NullReferenceException
if(t->parent == nullptr) // Throws NullReferenceException
{
Console::WriteLine("parent is nullptr");
}
Любые предложения, откуда это может прийти?Я действительно очень озадачен ...
Я использую библиотеку MathNet.Idirium, версия 2008.8.16.470