1

我已经搜索过,但无法得到我想要的东西......

我在做一个小游戏。我得到了这个struct包含播放器详细信息的信息。

struct Player
{
    string name;
    int level;
    int exp;
    int hp; // life
    int mp; // mana
    int shield;
};

当在菜单中,用户选择开始一个新游戏时,它会进入这个功能:

    int StartNewPlayer(string name)
    {
        Player player;

        player.name = name;
        player.level = 1;
        player.exp = 0;
        player.hp = 20;
        player.mp = 5;
        player.shield = 0;

        *pass/return the struct here*
    }

然后我有一个打印游戏板的函数,以及我应该在哪里使用新玩家结构中的数据,例如:

void game_board ()
{
    cout << "Hello!" << player.name;

    (...)
}

最后,在main我的某个地方:

int main ()
{
    StartNewPlayer(new_game());
    game_board();
}

调用上面的所有函数。

但我想不通...我尝试了引用,没有运气的指针..我需要一些帮助...

4

3 回答 3

2

这个怎么样?

Player StartNewPlayer(string name)
{
    Player player;

    player.name = name;
    player.level = 1;
    player.exp = 0;
    player.hp = 20;
    player.mp = 5;
    player.shield = 0;

    return player;
}

void game_board(Player player)
{
    cout << "Hello!" << player.name;

    (...)
}

int main ()
{
    Player player = StartNewPlayer(new_game());
    game_board(player);
}
于 2013-02-28T19:53:03.767 回答
1

不要使用传递值创建具有复杂数据类型的数据的额外副本

改用指针来传递可以在函数中修改的变量的地址。更改也将反映在调用者的函数中。

void StartNewPlayer(string name, Player *player)
{
    player->name = name;
    player->level = 1;
    player->exp = 0;
    player->hp = 20;
    player->mp = 5;
    player->shield = 0;
}

void game_board(Player* player)
{
    cout << "Hello!" << player->name;

    (...)
}

int main ()
{
    Player player;
    StartNewPlayer(new_game(), &player);
    game_board(&player);
}

使用传递引用的替代方法:

如果您是引用的粉丝,(这只是一个巧妙的编译器技巧,它再次在内部使用指针):

void StartNewPlayer(string name, Player& player)
{
    player.name = name;
    player.level = 1;
    player.exp = 0;
    player.hp = 20;
    player.mp = 5;
    player.shield = 0;
}

void game_board(Player& player)
{
    cout << "Hello!" << player.name;

    (...)
}

int main ()
{
    Player player;
    StartNewPlayer(new_game(), player);
    game_board(player);
}
于 2013-02-28T19:56:23.557 回答
-1

我建议返回一个指向 Player 结构的指针。如果您像现在一样返回“引用”,它将调用 Player 的复制构造函数,这可能会导致进一步的复杂化。

通常,在 StartNewPlayer(...) 结束时,您在其中声明的 Player 将不复存在,因为对象范围将结束,因此当您返回它时,c++ 编译器会知道您想要保持对象处于活动状态并将创建一份给你的,隐形的。如果你返回一个指向它的指针,你实际上是在返回你在函数中分配的对象。

假设您的 Player 结构中有指针,例如

struct Player
{
  int level;
  char* name; //lets assume you did it like that
}

当您返回播放器时,将复制 int,但不会复制 char*。int 很容易处理,而 char* 需要各种棘手的函数,比如strlenand strncpy。您的 Player 结构越复杂,使用默认复制构造函数将面临的问题就越多。

另一种解决方案是自己为 Player 结构声明一个复制构造函数(实际上,您可以使用类,因为它们在 c++ 中大部分是可互换的)。

Player(const Player& p)
{
    name = p.name;
    level = p.level;
    // and so forth
}

所以我会用

Player* StartNewPlayer(std::string name)
{
    Player* player = new Player();
    player->name = name;
    player->level = 1;
    // snip 
    return player;
}

在你的程序结束时,一定要delete player否则你会有内存泄漏

于 2013-02-28T20:05:13.793 回答