Добавление элементов в вектор в одном классе не относится к другим классам - PullRequest
0 голосов
/ 20 июня 2019

Проблема в том, что когда я добавляю элемент, используя push_back, к вектору в одном классе, а затем, когда я пытаюсь получить доступ к этому вектору из другого класса, изменения не сохраняются.Ни один элемент не был добавлен к вектору из этого другого класса, но из класса, в который я его добавил, он был добавлен без проблем.

Я пытался сделать это ссылками и указателями, но так как я 'Я довольно новичок в C ++. Я не смог понять это.Пытался поместить & и * перед переменными, функциями и тому подобным, но ничего не работало.

Hand.h

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

Hand.cpp

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

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

Dealer.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, и изменения не применяются от другого класса.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вы работаете над двумя разными экземплярами Hand, поэтому он не работает. Объект Hand внутри Dealer::DealCard отличается от объекта 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;
    }
}
0 голосов
/ 20 июня 2019
Dealer dealer;
dealer.DealCard(1);

Hand hand; //hand you are interested in 
std::vector<Card> dealerCards = hand.GetDealerCards();
std::cout << dealerCards.size() << std::endl;

Посмотрите на этот порядок кода: вы создаете класс Dealer внутри его метода DealCard, вы создаете объект руки, который не имеет отношения или что-либо еще с 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;
}

Примечание: я настоятельно рекомендую вам изменять значения карты дилера с помощью заданного метода, а не получать ее по ссылке и менять ее.Если ваш код растет, будет трудно проследить, где этот атрибут изменился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...