检查传递给方法的对象是否为“this”

时间:2016-01-07 15:25:43

标签: c++ class methods

我正在尝试解决以下问题:

假设我正在编写一个具有方法myMethod的类,它修改了*this和传递的参数:

class MyClass {
    //some code here
    void myMethod(MyClass& other) {
        //modify *this and other
    }
}; 

问题在于,当调用以下部分时,我希望该方法不执行任何操作:

MyClass x;
x.myMethod(x);

检查相等是不够的,因为我希望能够为两个相同的对象调用它。

例如,假设MyClass类似于std::setmyMethod合并了两个集合,排空other,以更加脚踏实地的方式。可以合并两个相同的集合,但我显然不能清空并同时填充一个集合。

我该如何检查?任何建议将不胜感激。

4 个答案:

答案 0 :(得分:6)

您只需将otherthis的地址进行比较:

class MyClass {
    //some code here
    void myMethod(MyClass& other) {
        if (this != &other) {
            //modify *this and other
        }
    }
}; 

由于您通过引用传递,如果将相同的对象传递给您调用它的函数,则指针将是相等的。

答案 1 :(得分:4)

您可以检查对象的地址。如果它们相同,则返回或抛出异常或其他:

class MyClass {
    //some code here
    void myMethod(MyClass& other) {
        if(this==&other){
             //return or throw
        }
        //modify *this and other
    }
}; 

答案 2 :(得分:3)

这个简单

If (&other == this)
    .....your code......

答案 3 :(得分:2)

您描述的这些困难类似于编写复制赋值运算符的困难。基本上,单独的地址检查虽然有用的性能优化,但不足以在存在异常的情况下实现操作的完全正确性。您可以使用“复制和交换”中的提示。成语在这里实现异常安全。

以下是代码示例:

void MyClass::foo(MyClass& other) {
    MyClass tmp(this);
    tmp.add_from(other);
    other.empty();
    swap(tmp, *this);
}

这里swap需要确保永远不会抛出异常。您仍然可以在开始时比较地址,但它只是性能优化,而不是实际的安全机制。