如何创建具有多个标识符的函数?

时间:2013-03-02 05:55:22

标签: c++ function

我想创建一个函数,在不同的上下文中,最好用不同的名称调用它。

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

或者,有更好的方法吗?我可以让左/右成员在位置或大小改变时自动更新,而不是为每次通话重新计算吗?

3 个答案:

答案 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的说法:同一功能没有两个名字。这令人困惑。