C++ 创建数组以迭代成员的两个数组

C++ 创建数组以迭代成员的两个数组,c++,iteration,C++,Iteration,我正在做纸牌游戏 在这个游戏中,我有球员,他们是一个团队的成员(每个团队2名球员),他们可以加入一个大厅 大厅里有一名队员,两个队都有一名队员。我想直接迭代玩家,而不是每次都遍历团队 相关C++代码: 大厅.h class Lobby { public: Lobby(std::string const& name, std::vector<Team> const& teams = std::vector<Team>()); Lobby()

我正在做纸牌游戏

在这个游戏中,我有球员,他们是一个团队的成员(每个团队2名球员),他们可以加入一个大厅

大厅里有一名队员,两个队都有一名队员。我想直接迭代玩家,而不是每次都遍历团队

相关C++代码:

大厅.h

class Lobby {

public:
    Lobby(std::string const& name, std::vector<Team> const& teams = std::vector<Team>());
    Lobby(){};
    ~Lobby();

    // give cards to all players
    void deal();

    std::vector<std::shared_ptr<Player> > getPlayers(); // this is the one I'm trying to implement

   [...]

private:
    std::string _name;
    std::vector<Team> _teams;
};
class Team {
public:
    Team();
    Team(std::string name);
    ~Team();
    void addPlayer(Player const& player);
    void addTrick(Trick const& trick);
    void setScore(int const& newScore);
    void addPoints(int const& score);
    int getScore();
    std::vector<Trick> getTricks();

    std::vector<Player>& getPlayers();
    bool isTeamDealing();

private:
    std::string _name;
    std::shared_ptr<std::vector<Player> > _players;
    int _score;
    std::vector<Trick> _wonTricks;
};
班级大厅{
公众:
大厅(std::string const&name,std::vector const&teams=std::vector());
大厅{};
~lobble();
//给所有玩家发牌
无效交易();
std::vector getPlayers();//这是我正在尝试实现的一个
[...]
私人:
std::string _name;
std::vector_团队;
};
大厅.cpp

[...]
void Lobby::deal()
{
    vector<Card> cards = Card::getAllCardsShuffled();

    for (int i = 0; i < cards.size(); i++) {
        getPlayers()[i % 4].addCard(cards[i]); // this is how I'd like to use getPlayers()
    }
    cout << _teams[0].getPlayers().at(0).getCards().size() << endl;
    // this compiles but I'm not getting any cards in my players (prints 0)
    // I think a copy is made somewhere, so I'm always getting new players
}


// this is the method I'm trying to implement... 
vector<shared_ptr<Player> > Lobby::getPlayers()
{
    return {
        make_shared<Player>(_teams[0].getPlayers().at(0)),
        make_shared<Player>(_teams[0].getPlayers().at(1)),
        make_shared<Player>(_teams[1].getPlayers().at(0)),
        make_shared<Player>(_teams[1].getPlayers().at(1))
    };
}
[...]
Team::Team(string name)
    : _name(name)
    , _score(0)
    , _players(vector<Player>())
{
}

void Team::addPlayer(Player const& player)
{
    if (_players.size() < 2) {
        _players.push_back(player);
    }
}

vector<Player>& Team::getPlayers()
{
    return _players;
}
[...]
[…]
void lobble::deal()
{
向量卡=卡::GetAllCardsHuffled();
对于(int i=0;i所以我找到了一种方法,使用
std::reference\u包装器

vector<reference_wrapper<Player> > Lobby::getPlayers()
{
    return {
        _teams[0].getPlayers().at(0),
        _teams[0].getPlayers().at(1),
        _teams[1].getPlayers().at(0),
        _teams[1].getPlayers().at(1)
    };
}

void Lobby::deal()
{
    vector<Card> cards = Card::getAllCardsShuffled();

    for (int i = 0; i < cards.size(); i++) {
        getPlayers().at(i % 4).get().addCard(cards[i]);
    }
}
向量大厅::getPlayers() { 返回{ _团队[0].getPlayers().at(0), _团队[0]。getPlayers()。位于(1), _团队[1]。getPlayers()。位于(0), _团队[1].getPlayers().at(1) }; } void lobble::deal() { 向量卡=卡::GetAllCardsHuffled(); 对于(int i=0;i

如果有人看到更好的方法,我洗耳恭听。

与其让大厅直接获取玩家,不如让大厅创建卡片,然后将他们的卡片份额传递给每个团队(通过迭代器),然后让团队将卡片分发给其玩家?所有共享指针的目的是什么?玩家的生命周期不应该被很好地定义吗?我刚刚意识到根据402的回答,我可以在团队中使用引用而不是共享的ptr。所以现在看起来像这样
std::vector&getPlayers()
@Nard我也希望能够在代码的其他部分使用这个
getPlayers
方法。我想我可以按照你的建议去做,但对我来说这似乎更复杂(我必须为团队添加一个方法来再次发牌)@corentis。如果你坚持这样做,我现在看到的情况是
让团队共享(_团队[0].getPlayers()->at(0))
创建一个新的
shared\u ptr
,创建一个新的
Player
并将新的
shared\u ptr
分配给它,然后复制
\u团队[0]。getPlayers()->at(0)
通过值进入这个新的
播放器
。因此,您对这个新的
播放器
执行的任何更改都不会影响
\u团队[0]。getPlayers()->at(0)
。要解决这个问题,只需返回一个
std::vector
,其中引用直接指向
\u团队[0]。getPlayers()->at(0)
vector<reference_wrapper<Player> > Lobby::getPlayers()
{
    return {
        _teams[0].getPlayers().at(0),
        _teams[0].getPlayers().at(1),
        _teams[1].getPlayers().at(0),
        _teams[1].getPlayers().at(1)
    };
}

void Lobby::deal()
{
    vector<Card> cards = Card::getAllCardsShuffled();

    for (int i = 0; i < cards.size(); i++) {
        getPlayers().at(i % 4).get().addCard(cards[i]);
    }
}