void函数指针的二维数组c++

Spe*_*cer 5 c++ arrays pointers

我正在尝试在 2 个计算机“玩家”之间构建一个高效的石头剪刀布模拟器。我在这里看到的一个建议是使用矩阵来存储可能的结果。我真的很喜欢这个想法,因为这意味着我不必有 9 个不同的 if() 语句来说明所有可能的值。每当比赛结束时,我都有函数来迭代每个玩家的获胜、失败和平局的数量。因此,我认为如果我可以构建一个函数指针的二维数组,那么 [0][0] 表示双方都抛出“Rock”并导致 Draw,抛出函数 addDraw( ) 每个玩家。我找到了一个在这里工作的一维函数指针数组的例子。

当我尝试编译时,我的代码抛出了几个错误。让我知道是否需要其他任何东西。

调用结果的函数:

void Player::result(vector<Player*> &vals, int x, int y)
{
    Player *p1 = vals[0];
    Player *p2 = vals[1];

    void(*results1[3][3]) =
    {
        { p1->addDraws, p1->addWins, p1->addLosses },
        { p1->addLosses, p1->addDraws, p1->addWins },
        { p1->addWins, p1->addLosses, p1->addDraws }
    };
}
Run Code Online (Sandbox Code Playgroud)

添加赢、输和平局的函数:

void Player::addWins()
{
    wins++;
}

void Player::addLosses()
{
    losses++;
}

void Player::addDraws()
{
    draws++;
}
Run Code Online (Sandbox Code Playgroud)

所有函数都在 Player.h 中初始化并在 Player.cpp 中声明(我认为这是正确的术语)。我收到的最常见的错误是“错误 C2440:‘初始化’:无法从‘void (__thiscall Player::*)(void)’转换为‘void *’

mol*_*ilo 2

您有一个 void 指针数组,而不是函数指针,并且成员函数也不是函数指针。

你需要类似的东西

typedef void (Player::*Score)();  // typedefs and function types go together well
Score scores[3][3]) =
{
    { &Player::addDraws, &Player::addWins, &Player::addLosses },
    { &Player::addLosses, &Player::addDraws, &Player::addWins },
    { &Player::addWins, &Player::addLosses, &Player::addDraws }
};

// Calling
Player a;
(a.*scores[0][0])();
Run Code Online (Sandbox Code Playgroud)

或者,使用这样的免费函数:

void addWins(Player* p)
{
    p->addWins();
}

// Similar for the others...

typedef void (*Score)();
Score scores[3][3] = {{ addWins, .... 

//
Player* player = ...
scores[0][0].addWins(player);
Run Code Online (Sandbox Code Playgroud)

或者,您可以现代并使用std::function.