背面效应和过载

back-sides effects and overloading

本文关键字:背面      更新时间:2023-10-16

c++中是否存在函数的"智能"重载?

简单来说:

  classname classname::Foo(const classname& t){
     classname workVar = t.clone(); 
                   //great work, like this GREAT(), that changing workVar;
     return workVar;
  }
                    //back-side effect here, changing object
  void classname::Foo(){
     classname workVar = (*this).clone();
                    //the same, GREAT() changing workVar
     (*this).copy(workVar);
  }

有什么可能将这两个函数合并为一个函数吗?

第一种方式,用于更改当前对象:

   obj = obj.Foo(obj);

第二种方式:

   obj.Foo();

如何在不重新定义函数的情况下将这些函数合并为一个函数?

在第二个Foo()中,您指定了一个"this",但它看起来不像是类成员函数。它是类名::Foo()吗?

clone()通常返回一个指向新创建的对象的指针,该对象与您创建的对象相同。因此,您可以将其分配给一个指针变量。虽然它可能会返回引用,但它会令人困惑,因为你需要管理它,即稍后删除它,而你通常不会期望对引用这样做。

您不会像现在这样将克隆分配给新对象。

this.在C++中不是有效语法,因为"this"始终是一个指针。

如果你的一般问题是一个名为Foo的外部函数是否取常量T&可以自动调用T::Fooboost::bind实际上做了一些非常聪明的事情,因为你可以做一些类似的事情

boost::bind( &classname::Foo, workVar )

来自外部和

boost::bind( &classname::Foo, this )

从内部,如果这是一个免费的功能,那么

boost::bind( Foo, workVar )

同样有效,它们中的每一个都创建了一个不带参数的函数,尽管在您的情况下它们有不同的返回类型,所以它不适用于您的特定示例。

`