如何将一个对象的多个实例发送到一个函数中

How can I send multiple instances of an object into one function

本文关键字:函数 一个 一个对象 实例      更新时间:2023-10-16

我有一些像这样的代码

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

我想让它成为一个函数,而不是需要添加另一个函数,它只是对同一类的不同对象做完全相同的事情。有办法做到这一点吗?如果有的话,有人能给我指个方向吗?

只需向函数传递一个附加参数,该参数告诉您处理哪个类成员。

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??

好吧,因为你的变量是公共的,你总是可以传入你想操作的:

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

如果关注性能,并且如果有许多"卡片类型";我会使用函数指针(即:方法指针)。

void (Split::*pfGetTheCard)(Hand & phand);
// Dynamically assign it to one of those:
pfGetTheCard =  &Split::getCardTwo;
// And call it:
(cardobj.*pfGetTheCard)(); 
(pCardPtr->*pfGetTheCard)(); 

请注意,这可能不是合适的解决方案,因为这完全取决于您的设计,性能和维护问题。这只是我的主意!

相关文章: