Передать вектор карты в функцию для печати и использования?

Я борюсь с карточной программой и хочу передать свой единственный вектор карты в свою функцию, чтобы его можно было использовать. Прямо сейчас я просто хотел бы проверить, может ли он печатать карты из колоды, но конечной целью является передача ее в руку игрока. Как лучше всего передать этот вектор для использования в функциях?

Заранее спасибо!!

функция для создания колоды:

void Deck::createDeck() {
deck.clear();
static const char suits[] = {'C','D','H','S'};
for (int suit=0; suit < 4; suit++)
    for (int val=1; val <=13; val++)
        deck.push_back(Card(val,suits[suit]));
}

функция передачи карты:

void Card::printCard(Card& drawnCard) const { //for debugging purposes
cout << value << " of " << suit << endl;

}

прототипы были объявлены в заголовке следующим образом:

class Card{
public:
    int value;
    char suit;
    string drawnCard;
    Card(int value, char suit) : value(value), suit(suit) {}
    void printCard(Card& drawnCard) const;
};

class Deck {

public:
    void createDeck();
    void shuffleDeck(Card);
    Card drawRandomCard();
    Deck(); 
    vector<Card> deck;
};

Спасибо еще раз!


person aishere    schedule 19.02.2015    source источник


Ответы (1)


Здесь есть что критиковать. Вероятно, вы не хотите передавать список карт напрямую, но вместо этого, вероятно, захотите передать колоду, например:

 void DoSomething(const Deck& deck) {
    // ...
 }

Однако, предполагая, что вы передаете список, способ передать его будет как константная ссылка:

void DoSomething(const std::vector<Card>& cards) {
   // ...
}

Однако есть много других областей, где ваш пример кода можно было бы улучшить. Например, поля данных Карты и Колоды, вероятно, должны быть «частными» и доступны только через соответствующие функции доступа. Кроме того, printCard не нужно принимать карту в качестве входных данных, поскольку она работает с this (и, если она принимает параметр, функция, которая просто печатает объект, должна принимать свой параметр в виде константы, а не изменяемой ссылки).

См. эту суть в качестве примера.

person Michael Aaron Safyan    schedule 19.02.2015
comment
Хорошо, я ценю все советы. Итак, используя ваш первый пример, будет ли прототип помещен в класс Deck и будет void printCard(const Deck& deck), тогда моя функция будет void Deck::printCard(const Deck& deck), но я не думаю, что значения из вектора карт теперь передаются, потому что мое значение и масть равны not declared in this scope? Спасибо! - person aishere; 19.02.2015
comment
Нет, это будет void Card::printCard() const или void PrintCard(const Card&card). Если у вас есть Card:: в качестве префикса и он не является статическим, вы уже находитесь в контексте конкретной карты и не должны использовать карту в качестве параметра. - person Michael Aaron Safyan; 19.02.2015
comment
Это прототип? Я просто не понимаю, куда это пойдет, поскольку у меня есть класс колоды и класс карт. Спасибо еще раз. - person aishere; 19.02.2015
comment
Я думаю, вы можете найти это иллюстративным: gist.github.com/michaelsafyan/0a62e42aa50be661430b - person Michael Aaron Safyan; 19.02.2015
comment
Да спасибо. Это очень помогает. По сути, это первый раз, когда мне пришлось соединить кучу вещей вместе, поэтому я столкнулся с множеством проблем, но спасибо за публикацию этого. - person aishere; 19.02.2015