我正在编写一个C++/CLI包装器,用于包装一个C++本机静态库。
我对C++/CLI和C++都没有太多经验。我遵循了在网上阅读到的最佳实践来创建C++/CLI包装器。我的包装器具有指向C++类的指针。我的C++类已经重载了运算符==。
我正在尝试在我的包装器中也重载它,并使用C++类的实现,但是当包装器为空时,我遇到了错误。
我搜索了如何知道我的句柄是否为空,并发现你必须将其与nullptr进行比较。
我在C++/CLI中有这个方法
MyOtherClass const* MyClass::MyMethod(MyWrapper^ instance)
{
if(instance == nullptr)
{
return NULL;
}
return instance->Property;
}
代码中的if(instance == nullptr)调用了我重载的==操作符。
static bool operator==(MyWrapper^ a, MyWrapper^ b)
{
return a->InternalInstance == b->InternalInstance; //Here System.AccessViolationException Exception
}
问题在于如果 a 为 null,这将会抛出一个 System.AccessViolationException 异常。
我不能简单地添加一个与 nullptr 的比较来检查 a 和 b,因为这会导致堆栈溢出。
static bool operator==(MyWrapper^ a, MyWrapper^ b)
{
if(a == nullptr && b == nullptr) //Stack Overflow here because a == nullptr calls this method again.
return true;
if((a == nullptr && b != nullptr) || (a != nullptr && b == nullptr))
return false;
return a->InternalInstance == b->InternalInstance;
}
我怎样可以覆盖==运算符,使用我的C++本地实现,并且确保保护我的句柄不为空?
MyWrapper ^
不是空指针,您可以有一个显式重载的bool()
运算符,它返回true。 - yizzlezNULL
或nullptr
,则如果您有语句if(a)
,它应该等同于false
。另一个选项是使用ReferenceEquals
。 - Zac Howland