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

时间:2014-11-21 06:47:34

标签: c++ arrays pointers

我正在尝试在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;

3 个答案:

答案 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才能执行操作。

要解决问题,有几种方法:

  1. 使用void (*)()而不是使用void (*)(MyClass *)函数,并将要更新的实例传递给函数

  2. 使用指向成员的指针。引擎盖下基本相同,但语法有点奇怪;类型为void (MyClass::*)()并且使用成员指针进行调用时,语法将使用奇怪的->*运算符,例如(this->*m[i][j])()

  3. 使用闭包。这需要C ++ 11,从语法的角度来看更为清晰;而不是使用指针矩阵来运行,而是使用捕获对象实例的std::function<void()>个对象矩阵。 C ++闭包无法处理向上的funarg问题,但在你的情况下,这不应该是一个问题(在我看来,不需要在持有计数器的实例中存在其中一个闭包)。

    < / LI>

    在非常具体的情况下,我根本不会使用指向函数的指针,而是使用带有结果(0,1,2)的整数矩阵然后更新结果代码只是

    results[m[i][j]]++;
    

    没有if且没有涉及电话。在这个想法中,results是一个由三个整数组成的数组,其中A为胜利计数器,为B和领带胜出。