2013-01-20 54 views
0

我有一些代碼,看起來像這樣我怎麼能發送對象的多個實例爲一個功能

class Split 
{ 
public: 
    Split(Hand *pcHand = NULL) 
     : phand(pcHand), phandsplit(pcHand) 
    { 
    } 

    int CardOne; 
    int CardTwo; 
    int CardThree; 

    void getCardOne(Hand & phand) 
    { 
     CardOne = phand.SendCOneToSplit(); 
     std::cout << "Card One: " << CardOne << std::endl; 
    } 

    void getCardTwo(Hand & phandsplit) 
    { 
     CardTwo = phandsplit.SendCOneToSplit(); 
     std::cout << "Card Two: " << CardTwo << std::endl; 
    } 

    void getCardThree(Hand & phandsplitTwo) 
    { 
     CardThree = phandsplitTwo.SendCOneToSplit(); 
     std::cout << "Card Two: " << CardTwo << std::endl; 
    } 

private: 
    Hand * phand; 
    Hand * phandsplit; 
}; 

我想讓它,而不是需要添加其他功能,做同樣的事情一個功能只是與同一個班級的不同對象而已。有沒有辦法做到這一點?如果是這樣,任何人都可以指出我正確的方向嗎?

+1

您是否熟悉STL容器?或數組? – Beta

+0

一點點。我對編程比較陌生。我已經使用過它們,但程度不是很高。 – Chivos

+0

我已經在下面回答了,但是有一件事讓我擔憂你的問題:你的函數接受一個名爲phand的引用,並且該類有一個與你沒有使用的名稱相同的指針。你有意將這些成員變量包含在你的問題中嗎? –

回答

2

只需傳遞一個附加參數給函數,告訴你要處理哪個類成員。

enum 
{ 
    CardOne, CardTwo, CardThree, //so on.... 
}CardNumber; 

void getCard(Hand & phandsplitTwo, CardNumber card) 
{ 
    if(card == CardOne) 
     CardOne = phand.SendCOneToSplit(); 
    else if(card == CardTwo) 
     CardTwo = phandsplit.SendCOneToSplit(); 
    else if(card == CardThree) 
     CardThree = phandsplitTwo.SendCOneToSplit(); 
    //.... 
} 

注:
我不知道爲什麼,雖然你的名字你的方法getXXXXX,但實際上並沒有返回任何東西。也許,名字應該是setXXXXXX ??

+0

雖然有什麼樣的參數可以做到這一點?我可以使用字符串嗎? – Chivos

+0

@ user1956980:更新了答案。 –

0

好吧,既然你的變量是公開的,你總是可以只通過在你想要操作的一個:

void getCard(Hand& hand, int& card) 
{ 
    card = hand.SendCOneToSplit(); 
    std::cout << "Card: " << card << std::endl; 
} 

然後調用這樣的:

split.getCard(hand, split.CardOne); 

當然,使用公共變量可能不是一個長期的解決方案,所以另一種選擇是替換:

​​

一個數組:

int cards[3]; 

然後就是通過索引你想:

void getCard(Hand& hand, int ndx) 
{ 
    cards[ndx] = hand.SendCOneToSplit(); 
    std::cout << "Card: " << cards[ndx] << std::endl; 
} 
+0

如果調用者傳遞超出邊界的索引會發生什麼情況? * Ka-boom!* –

+0

@Alok:那麼你的輸入無效。何時以及如何處理無效輸入是一個完全不同的話題。 –

+0

國際海事組織的一般準則是你應該提供一個安全的接口,不要委託給呼叫者傳遞正確的輸入的全部責任。你的代碼應該至少處理錯誤的輸入。 –

0

如果性能是值得關注的,如果有很多「卡類型」;我會使用函數指針(即方法指針)。

void (Split::*pfGetTheCard)(Hand & phand); 

// Dynamically assign it to one of those: 
pfGetTheCard = &Split::getCardTwo; 

// And call it: 
(cardobj.*pfGetTheCard)(); 
(pCardPtr->*pfGetTheCard)(); 

請注意,這可能不是合適的解決方案,因爲這一切都取決於您的設計,性能和維護問題。這只是我的想法!

+0

性能不是一個問題,所以我會試一試,看看它運行得很好。非常感謝你! ;) – Chivos

相關問題