题
当我去通过代码写的同事现,在某些地方,他们使用:
this->doSomething(); //-->case A
doSomething(); //-->case B
事实上我不知道有关伟大的使用情况*本指...:(
另一个问题与参数匹配:
obj.doOperation(); //-->case C
(&obj)->doOperation(); //-->case D
事实上这两种情况下执行所需的操作,它是一个简单的方式使代码看起来更加复杂?
什么是您的建议在上述两个问题吗?当时是合适的时间来使用它们,为什么?
解决方案
这是不是一个回答你的问题,但请注意这两个片段可以做不同的事情:
namespace B { void doSomething() {} }
struct A {
void f()
{
using B::doSomething;
this->doSomething(); // call A::doSomething
doSomething(); // calls B::doSomething
}
int a;
void g(int a)
{
this->a = a; // assigns argument to member
}
A* operator & () { return this; }
void doOperation() {}
void doSomething() {}
};
void g(A &obj)
{
obj.doOperation(); // calls A::doOperation directly
(&obj)->doOperation(); // calls A::operator & first
}
其他提示
案件B和C都是适当的方式。案件A和D都是等同的,什么也不做不同的。
几个例外:
- 如果这类具有超载
operator&
这不会令人惊讶的事情,那么情况D可以做不同的东西,C.实际上具有类做这不是建议,因为这将是令人困惑。 - 如果有一个地方变量
doSomething
(或者别的东西的名字在局部范围),然后将参考一个不同的doSomething
比B它再次建议不要让自己成为这样一种情况,更好地得到不同的名称,以不同的事情。
C和d是不同的。如果doOperation
是虚拟的,情况下,d将执行虚拟呼叫,如果obj
不是参考壳体C将执行一个非虚拟呼叫。这假定该然而和operator&
operator->
没有过载。
我倾向于使用A对B由于可能存在本地doSomething
标识符。里面的模板代码,事情可能会变得更糟(虽然我现在不能拿出一个精确的例子)。它是一个良好的习惯采取。
不隶属于 StackOverflow