繁体   English   中英

重载==并与nullptr进行比较?

[英]Overloaded == and comparison with nullptr?

我正在编写C ++ Native Static Library的C ++ / CLI包装器。

我对C ++ / CLI或C ++没有多少经验。 我已经按照我在互联网上阅读的最佳实践来创建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;
}

这里的问题是重载函数o == operation是在C ++ / CLI中对引用类型执行的,所以如果我们按照相同的方式在本机C ++中执行此操作,则意味着执行==运算符的重载函数指针类型。 但在本机C ++中,我们通常定义==运算符,如下所示:

bool operator==(const X& lhs, const X& rhs){ /* do actual comparison */ }

或者这样想,如果你在本机C ++中重载指针类型的==,你如何将这个类指针与null进行比较?

在托管环境中,默认情况下,运算符==通过确定两个引用是否指示同一对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能。 所以你应该实现Equals函数而不是重载==

请参考: 重载等于()和运算符==的指南 虽然它是关于C#的,但我认为它也适用于C ++ / CLI中的托管类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM