2013-03-02 100 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