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

我想让它成为一个函数,而不是需要添加另一个函数,它只对同一类的不同对象执行完全相同的操作。有没有办法做到这一点?如果是这样,谁能指出我正确的方向?

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 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 回答
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 回答