如何在c ++中检查对象是否==这个

jla*_*ack 2 c++ oop

我花了很多时间用Java编程并花了相当多的时间编写c ++,但是我遇到了一个我无法解决的问题.在Java类中,我可以简单地编写以下内容,

public void doOperation(object a)
{
    if(a != this)
    {
        set(a); // just some method that sets this.a = object.a
    }

    doOperation();
}

public void doOperation()
{
   this.a = pow(this.a,3);
}
Run Code Online (Sandbox Code Playgroud)

我在c ++中实现的部分是if语句,我检查参数对象是否等于this.我在c ++中试过这个

object::doOperation(object a)
{
    if(a != this)
    {
        set(a);
    }

    doOperation();
}

object::doOperation()
{
    this->a = pow(this->a,3)
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是"不匹配'运算符!='(操作数类型是'object'和'object*const')".提前感谢任何可以提供帮助的人!

Chr*_*eck 7

您只需通过引用传递"a",将指针指向"a"并将其与"this"进行比较,如下所示:

object::doOperation(object & a)
{
    if(&a != this)
    {
        set(a);
    }

    doOperation();
}

object::doOperation()
{
    this->a = pow(this->a,3)
}
Run Code Online (Sandbox Code Playgroud)

这是人们在C++中实现复制赋值运算符的标准方法.它并不总是以这种方式完成,但通常它的实现将对对象进行const引用,并使用对"this"的检查来防止自我赋值.

编辑:让我尝试采取更广泛的观点,这可能对您更有用.

在Java中,对象通过引用而不是通过值隐式传递,并且它们也被垃圾收集,当没有人再需要它们时自动销毁.

在C++中获得这种语义的最接近的方法是std::shared_ptr<A>在java中传递你的传递A.然后,当您需要进行比较时this,您可以使用该get方法从共享指针获取原始指针,并将其与字面意义进行比较.或者,如果std::enable_shared_from_this在定义类时使用模板,则可以使用在成员函数中的任何位置shared_from_this获取shared_ptr<A>此模板,并直接比较shared_ptr.

我假设您正在使用C++ 11,否则您将使用boost标头.

另请注意有关"weak_ptr"的内容,如果您有循环引用,则可能需要使用它们.

  • `a`永远不会等于`this`,因为它是按值传递的. (7认同)