背面效应和超载

时间:2012-03-01 16:17:13

标签: c++ function overloading

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();

如何将这些功能合并到一个具有重新定义功能的功能中?

1 个答案:

答案 0 :(得分:1)

在你的第二个Foo()中你指定一个“this”但它看起来不像一个类成员函数。是classname :: Foo()?

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

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

this.在C ++中不是有效的语法,因为“this”始终是指针。

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

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

来自外部和

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

从内部,如果是免费功能,那么

boost::bind( Foo, workVar )

也可以,每个都创建一个不带参数的函数,虽然在你的情况下它们有不同的返回类型,所以它不适用于你的特定例子。

`