首页 > 解决方案 > 在一个类中向向量添加元素不适用于其他类

问题描述

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

我已经尝试过使用引用和指针,但是由于我对 C++ 还很陌生,所以我无法弄清楚。尝试将&'s 和*'s 放在变量、函数之类的东西之前,但没有任何效果。

手.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,并且这些更改不适用于其他类。

标签: c++vector

解决方案


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

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


推荐阅读