在一个类中向向量添加元素不适用于其他类

Adding elements to vector in one class doesn't apply to other classes

本文关键字:添加 向量 元素 不适用 其他 适用于 一个      更新时间:2023-10-16

问题是,当我使用 push_back 将元素添加到一个类中的向量时,然后当我尝试从另一个类访问该向量时,更改尚未保存。没有从另一个类添加到向量中,但是从我添加的类中,没有任何问题地添加了它。

我尝试过使用引用和指针,但由于我对C++相当陌生,因此我一直无法弄清楚。尝试将&*放在变量,函数之类的东西之前,但没有任何效果。

手.h

class Hand {
public:
    std::vector<Card>& GetDealerCards();
};

手.cpp

std::vector<Card>& Hand::GetDealerCards() {
    return this->dealerCards;
}

游戏.cpp

void Game::Initialize() {
    Dealer dealer;
    dealer.DealCard(1);
    Hand hand;
    std::vector<Card> dealerCards = hand.GetDealerCards();
    std::cout << dealerCards.size() << std::endl;
    for (int i = 0; i < dealerCards.size(); i++) {
        std::cout << dealerCards.size() << std::endl;
    }
}
int main() {
    Game game;
    game.Initialize();
    return 0;
}

经销商.cpp

void Dealer::DealCard(int cards) {
    Hand hand;
    for (int i = 0; i < cards; i++) {
        Card card(SelectRandomElement(cardSuits, 4), SelectRandomElement(cardValues, 12));
        std::vector<Card>& dealerCards = hand.GetDealerCards();
        dealerCards.push_back(card);
    }
}

Game 类中,我打印出 dealerCards 向量中有多少个元素,但它仍然打印 0,并且更改不应用于其他类。

您正在处理两个不同的Hand实例,这就是它不起作用的原因。Dealer::DealCard 中的 Hand 对象与 Game::Initialize 中的对象不同。

像这样的更改应该可以解决您的问题,但是您必须小心使用原始指针。

class Dealer {
public:
    Dealer() : m_hand(new Hand) {}
    ~Dealer() { delete m_hand; }
    void DealCard(int cards) {
        for (int i = 0; i < cards; i++) {
            Card card(SelectRandomElement(cardSuits, 4), SelectRandomElement(cardValues, 12));
            std::vector<Card>& dealerCards = m_hand.GetDealerCards();
            dealerCards.push_back(card);
        }
    }
    Hand* getHand() { return m_hand; }
private:
    Hand* m_hand;
}
void Game::Initialize() {
    Dealer dealer;
    dealer.DealCard(1);
    Hand* hand = dealer.getHand();
    std::vector<Card> dealerCards = hand->GetDealerCards();
    std::cout << dealerCards.size() << std::endl;
    for (int i = 0; i < dealerCards.size(); i++) {
        std::cout << dealerCards.size() << std::endl;
    }
}

编辑:如果你愿意,你甚至可以像这样没有Hand类:

class Dealer {
public:
    Dealer() {}
    void DealCard(int cards) {
        for (int i = 0; i < cards; i++) {
            m_cards.emplace_back(SelectRandomElement(cardSuits, 4), SelectRandomElement(cardValues, 12));
        }
    }
    std::vector<Card> getCards() { return m_cards; }
private:
    std::vector<Card> m_cards;
}
void Game::Initialize() {
    Dealer dealer;
    dealer.DealCard(1);
    std::vector<Card> dealerCards = dealer->getCards();
    std::cout << dealerCards.size() << std::endl;
    for (int i = 0; i < dealerCards.size(); i++) {
        std::cout << dealerCards.size() << std::endl;
    }
}
Dealer dealer;
dealer.DealCard(1);
Hand hand; //hand you are interested in 
std::vector<Card> dealerCards = hand.GetDealerCards();
std::cout << dealerCards.size() << std::endl;

看看代码的顺序:你在其方法DealCard内创建一个Dealer类,你正在创建一个与hand you are interested in没有关系的手牌对象。

也许将手作为参数传递或使其成为属性,我会给你写一个快速修复,但这取决于你的设计,你应该写自己的版本。

void Dealer::DealCard(int cards, Hand& hand) {
    for (int i = 0; i < cards; i++) {
        Card card(SelectRandomElement(cardSuits, 4), SelectRandomElement(cardValues, 12));
        std::vector<Card>& dealerCards = hand.GetDealerCards();
        dealerCards.push_back(card);
    }
}

void Game::Initialize() {
    Hand hand;
    Dealer dealer;
    dealer.DealCard(1,hand);
    std::vector<Card> dealerCards = hand.GetDealerCards();
    std::cout << dealerCards.size() << std::endl;
    for (int i = 0; i < dealerCards.size(); i++) {
        std::cout << dealerCards.size() << std::endl;
    }
}
int main() {
    Game game;
    game.Initialize();
    return 0;
}

注意:我强烈建议您通过设置方法更改经销商卡的值,而不是通过引用并更改它。如果您的代码增长,则很难跟踪该属性的更改位置。