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 *’
您有一个 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.