我想创建一个函数,在不同的上下文中,最好用不同的名称调用它。
class box(){
private:
float posX;
float size = 10;
public:
float speedX;
float left(){ return posX; } //Any way to combine these?
float posX(){ return posX; } //Any way to combine these?
float right(){ return posX + size; }
};
box a;
box b;
bool checkCollide(){
if(a.right() < b.left()){ return 0; } //Not colliding
if(b.right() < a.left()){ return 0; } //Not colliding
return 1; //Colliding
} //Comparing right and left makes more sense than anything else
void physics(){
a.posX() += a.speedX;
b.posX() += b.speedX;
//Adding speed to position makes more sense than
//adding speed to "left"
}
//Loop physics X times per second, and do something if there's a collision
或者,有更好的方法吗?我可以让左/右成员在位置或大小改变时自动更新,而不是为每次通话重新计算吗?
答案 0 :(得分:3)
如果你真的有义务这样做,那么只需让一个函数调用另一个:
// the function that does the hard job
float foo(float a, float b)
{
// some heavy and complicated code
// ...
// some more black magic, etc.
// finally:
return sqrt(a * a + b * b);
}
// the function that pretends to do the hard job
float bar(float a, float b)
{
return foo(a, b);
}
但你最好不要这样做,这是非常糟糕的风格。不同的名字=&gt;不同的任务。相同的任务=&gt;一样的名字。不要伤害你的同伴的直觉......; - )
答案 1 :(得分:0)
是 - 不要写两个在开始时做同样事情的功能。我只希望他们不分歧。那你有问题!
答案 2 :(得分:0)
如果您使用的是C ++ 11或使用Boost,则可以将left()
函数绑定到std::function
变量。使用C ++ 11:
class box {
// ...
public:
// ...
float left() { return posX; }
const std::function<float()> posx = std::bind(&box::left, this);
需要const
,否则可以在运行时更改posx
以指向不同的功能。
如果你没有使用C ++ 11编译器而是使用Boost,那么它不具有表现力,因为你必须在ctor中初始化posx
:
class box {
// ...
public:
box() : posx = boost::bind(&box::left, this);
// ...
float left() { return posX; }
const boost::function<float()> posx;
在这两种情况下,您现在都可以:
box b;
b.left();
b.posx();
与拥有posx()
函数并在其中调用left()
相比,此方法实际上没有任何优势。但这是可能的,因此值得一提。
但我同意H2CO3的说法:同一功能没有两个名字。这令人困惑。