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

Posted

技术标签:

【中文标题】检查传递给方法的对象是不是为“this”【英文标题】:Checking if the object passed to a method is "this"检查传递给方法的对象是否为“this” 【发布时间】:2016-01-07 15:25:43 【问题描述】:

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

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

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

问题是我希望该方法在调用以下部分时什么都不做:

MyClass x;
x.myMethod(x);

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

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

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

【问题讨论】:

【参考方案1】:

你可以只比较otherthis的地址:

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

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

【讨论】:

就这么简单。显然我误解了this @Jytug,此处仅使用地址存在问题,请参阅我的(因不明原因投反对票)帖子。 @SergeyA 我猜你是在谈论复制和交换习语,但这不是一回事(虽然我没有对你投反对票)。 有什么不同?根据定义,将对象从一个集合复制到另一个集合是一种潜在的抛出操作。如果发生这种情况,您最终会完成一半的工作。 @SergeyA:我认为你需要一个介绍性的句子“你描述的这些困难类似于编写复制赋值运算符的困难......你可以使用'复制和交换'中的想法' 在这里实现异常安全的成语。”为了使答案更容易阅读。我认为您是对的,OPs 问题与复制赋值运算符非常相似,但除非您非常仔细地阅读 OPs 问题,否则您可能不会立即看到它,然后您的答案似乎与问题没有太大关系。 【参考方案2】:

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

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

【讨论】:

【参考方案3】:

就这么简单

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

【讨论】:

【参考方案4】:

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

以下是代码示例:

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

这里 swap 需要确保从不抛出异常。一开始还是可以比较地址的,但这只是性能优化,并不是真正的安全机制。

【讨论】:

以上是关于检查传递给方法的对象是不是为“this”的主要内容,如果未能解决你的问题,请参考以下文章

检查传递给方法的参数是不是是类中定义的常量之一?

如何检查传递给函数的参数数量是不是错误

Windows 7批处理文件:如何检查参数是不是已传递给批处理文件

如何检查 Laravel 集合是不是为空?

Mongoose:检查对象是不是为猫鼬对象

检查对象是不是为值类型的最有效方法