0

我想做一个函数,在不同的上下文中,最好用不同的名字来调用它。

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

或者,有没有更好的方法来做到这一点?我可以让左/右成员在位置或大小发生变化时自动更新,而不是每次调用都重新计算吗?

4

3 回答 3

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

但你最好不要这样做,这是很糟糕的风格。不同的名称 => 不同的任务。相同的任务 => 相同的名称。不要伤害你的同伴的直觉...... ;-)

于 2013-03-02T05:58:14.540 回答
0

是的——不要写两个一开始做同样事情的函数。我只希望他们不要分道扬镳。那你就有问题了!

于 2013-03-02T05:59:42.730 回答
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,那么它的表现力就没有那么强,因为您必须posx在 ctor 中进行初始化:

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 所说的:同一个功能不要有两个名字。这很令人困惑。

于 2013-03-02T13:40:36.287 回答