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 つの関数にしたいと考えています。これを行う方法はありますか?もしそうなら、誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

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にする必要がありますか?

于 2013-01-20T05:02:32.513 に答える
0

パフォーマンスが懸念される場合、および「カードタイプ」が多数ある場合。関数ポインタ(つまり、メソッドポインタ)を使用します。

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

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

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

これはすべて、設計、パフォーマンス、およびメンテナンスの問題に依存するため、適切なソリューションではない可能性があることに注意してください。これは私の考えです!

于 2013-01-20T05:19:56.263 に答える
0

変数は公開されているため、操作したい変数をいつでも渡すことができます。

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

次に、次のように呼び出します。

split.getCard(hand, split.CardOne);

もちろん、パブリック変数を使用することは長期的な解決策ではない可能性があるため、別のオプションは次のように置き換えることです。

int CardOne;
int CardTwo;
int CardThree;

配列で:

int cards[3];

そして、必要なインデックスを渡すだけです:

void getCard(Hand& hand, int ndx)
{
    cards[ndx] = hand.SendCOneToSplit();
    std::cout << "Card: " << cards[ndx] << std::endl;
}
于 2013-01-20T05:12:02.123 に答える