gpt4 book ai didi

c++ - 重载 == 并与 nullptr 进行比较?

转载 作者:太空狗 更新时间:2023-10-29 19:58:24 33 4
gpt4 key购买 nike

我正在编写 C++ native 静态库的 C++/CLI 包装器。

我对 C++/CLI 或 C++ 没有太多经验。我遵循了我在 Internet 上阅读的有关创建 C++/CLI 包装器的最佳实践。我的包装器有一个指向 C++ 类的指针。我的 C++ 运算符 == 重载了。

我也试图在我的包装器中重载它并使用 C++ 类的实现,但是当包装器为 null 时我收到错误。

我搜索了如何知道我的句柄是否为空,我发现你必须将它与 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 异常。

而且我不能简单地为 ab 添加与 nullptr 的比较,因为它会造成堆栈溢出。

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++ native 实现,并且仍然保护我的句柄为空?

最佳答案

使用Object::ReferenceEquals显式检查 null。

static bool operator==(MyWrapper^ a, MyWrapper^ b)
{
if(Object::ReferenceEquals(a, nullptr) && Object::ReferenceEquals(b, nullptr))
return true;

if(Object::ReferenceEquals(a, nullptr) || Object::ReferenceEquals(b, nullptr))
return false;

return a->InternalInstance == b->InternalInstance;
}

关于c++ - 重载 == 并与 nullptr 进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21916578/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com