2013-03-02 42 views
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 

或者,有没有更好的方法来做到这一点?我可以在任何时间更改位置或大小时自动更新左/右成员,而不是重新计算每个呼叫吗?

+0

要么使用不同的名称,要么使单一方法返回您的价值。不过,为了相同的目的而使用不同的名称可能会引起混淆。 – 2013-03-02 05:58:55

+0

您可以分配给函数指针......但可能是性能成本。我只会使用更通用的标签。 – 2013-03-02 06:00:46

+0

也许我应该让'posX'公开并做'a.posX + = a.speedX'?左/右比较将使用'.left()'和'.right()'来获得更清晰的语法。 编辑:除去函数'posX()'。 – AWTom 2013-03-02 18:14:43

回答

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

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

+0

我想你可能是正确的,但不是在这种情况下。为使用它的人设计一个简单易用的界面。除非你是招聘代理,否则为什么有两个名字可以做同样的工作! – 2013-03-02 06:02:09

+0

@EdHeal我建议你开始向后阅读答案,那么你将有机会注意到我的adivce最后几句话。 – 2013-03-02 06:03:09

+0

对不起 - 你是对的。与bf +狗一起需要睡眠。不要说mutt已经失去了bf! – 2013-03-02 06:14:07

0

是的 - 不写两个函数,在开始时做同样的事情。我只是希望他们不会分歧。那么你有问题!

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,但使用升压代替,那么它并不表现,因为你必须在构造函数初始化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所说的:对同一个函数没有两个名字。这很混乱。

+0

必须在运行时更改'posX'。 – AWTom 2013-03-02 18:04:43

+0

@ user2125707'posX'它不同于'posx'。你原来的代码在这方面都搞砸了,因为你对私有变量和公共函数使用了相同的标识符。在我提供的例子中,我将函数'posX'改为'posx'。我认为这是不言自明的。 – 2013-03-02 18:08:13

+0

“posX”和“posX()”的语法不同吗?无论如何,'posX'是私人的。 – AWTom 2013-03-02 18:11:53