在函数C ++之间传递struct

时间:2013-02-28 19:51:20

标签: c++ function struct

我已经搜索但未能得到我想要的东西......

我正在做一个小游戏。我得到了包含玩家详细信息的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();
}

调用上面的所有函数。

但我无法弄明白......我试过参考,指点没有运气..我需要一些帮助,请...

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

不要使用pass-by-value

创建具有复杂数据类型的数据的额外副本

使用指针来传递可在函数中修改的变量的地址。这些变化也将反映在呼叫者的功能中。

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);
}

答案 2 :(得分:-1)

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

通常,在StartNewPlayer(...)结束时,您声明的播放器将停止存在,因为对象作用域将结束,因此当您返回它时,c ++编译器将获得您希望保持对象处于活动状态并将无形地为您创建一份副本。如果你返回一个指向它的指针,你真的要返回你在函数中分配的对象。

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

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

当您返回播放器时,将复制int,但char *不会。 int很容易处理,而char *需要各种棘手的功能,如strlenstrncpy。您的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否则会发生内存泄漏