我正在尝试在2台计算机和34名玩家之间建立一个高效的Rock,Paper,Scissors模拟器。"我看到here的建议是使用矩阵来存储可能的结果。我真的很喜欢这个想法,因为这意味着我不必有9个不同的if()语句来解释所有可能的值。每当匹配完成时,我都有迭代每个玩家的胜利,损失和平局数量的功能。因此,我认为如果我可以构建一个二维数组的函数指针,以便[0] [0]代表一个" Rock"双方都会导致Draw,为每个玩家抛出addDraw()函数。我找到了一个函数指针的一维数组的例子,它有效here。
当我尝试编译时,我的代码抛出了几个错误。如果还有其他需要,请告诉我。
调用结果的函数:
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 }
};
}
添加胜利,损失和平局的功能:
void Player::addWins()
{
wins++;
}
void Player::addLosses()
{
losses++;
}
void Player::addDraws()
{
draws++;
}
所有函数都在Player.h中初始化,并在Player.cpp中声明(我认为这是正确的术语)。我收到的最常见错误是&#34;错误C2440:&#39;初始化&#39; :无法转换为&#39; void(__thiscall Player :: *)(void)&#39;到&#39; void *&#39;
答案 0 :(得分:0)
void (*results1[3][3]) = {
{ p1->addDraws, p1->addWins, p1->addLosses },
{ p1->addLosses, p1->addDraws, p1->addWins },
{ p1->addWins, p1->addLosses, p1->addDraws } };
我认为这应该是
void (*results1[3][3])() = {
{ p1->addDraws, p1->addWins, p1->addLosses },
{ p1->addLosses, p1->addDraws, p1->addWins },
{ p1->addWins, p1->addLosses, p1->addDraws } };
或者,您可以使用typedef
typedef void (*func)();
func results1[3][3] = {
{ p1->addDraws, p1->addWins, p1->addLosses },
{ p1->addLosses, p1->addDraws, p1->addWins },
{ p1->addWins, p1->addLosses, p1->addDraws } };
答案 1 :(得分:0)
你有一个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])();
或者,使用这样的免费功能:
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);
或者,您可以现代化并使用std::function
。
答案 2 :(得分:0)
在C ++中,方法不是函数。如果您的计数器位于类实例中,则调用的代码需要知道this
才能执行操作。
要解决问题,有几种方法:
使用void (*)()
而不是使用void (*)(MyClass *)
函数,并将要更新的实例传递给函数
使用指向成员的指针。引擎盖下基本相同,但语法有点奇怪;类型为void (MyClass::*)()
并且使用成员指针进行调用时,语法将使用奇怪的->*
运算符,例如(this->*m[i][j])()
。
使用闭包。这需要C ++ 11,从语法的角度来看更为清晰;而不是使用指针矩阵来运行,而是使用捕获对象实例的std::function<void()>
个对象矩阵。 C ++闭包无法处理向上的funarg问题,但在你的情况下,这不应该是一个问题(在我看来,不需要在持有计数器的实例中存在其中一个闭包)。
在非常具体的情况下,我根本不会使用指向函数的指针,而是使用带有结果(0,1,2)的整数矩阵然后更新结果代码只是
results[m[i][j]]++;
没有if
且没有涉及电话。在这个想法中,results
是一个由三个整数组成的数组,其中A为胜利计数器,为B和领带胜出。