背面效应和过载
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::Foo
,boost::bind
实际上做了一些非常聪明的事情,因为你可以做一些类似的事情
boost::bind( &classname::Foo, workVar )
来自外部和
boost::bind( &classname::Foo, this )
从内部,如果这是一个免费的功能,那么
boost::bind( Foo, workVar )
同样有效,它们中的每一个都创建了一个不带参数的函数,尽管在您的情况下它们有不同的返回类型,所以它不适用于您的特定示例。
`