Как я могу создать класс, который является вектором другого класса в C ++?

Спасибо за чтение моего вопроса.

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

#ifndef CARD_H
#define CARD_H

class Card {
public:
//here are the individual card values
int _suit;
int _value;
Card(int suit, int value);
};

#endif
#include "card.h"
//define suits
const int spades = 0;
const int clubs = 1;
const int hearts = 2;
const int diamonds = 3;
//define face cards
const int jack = 11;
const int queen = 12;
const int king = 13;
const int ace = 14;

Card::Card(int suit, int value){
_suit = suit;
_value = value;
}

Затем я решил создать класс колоды и в этом классе инициализировать мои карты, присваивая значение от 0 до 3 (масть), а затем от 2 до 14 (ранжирование карты). Я также добавляю карты в вектор, который я определил для их хранения, вот так:

#ifndef DECK_H
#define DECK_H

#include <vector>

class Deck {
public:
std::vector<Card> _deck(51);
Deck();
};

#endif
#include <iostream>
#include <vector>

#include "card.h"#include "deck.h"
const int all_suits = 4 - 1;
const int all_values = 14;

Deck::Deck(){
int i = 0;
for (int j = 0; j <= all_suits; ++j) {
//begin with 2 because card can't have value 0
for (int k = 2; k <= all_values; ++k) {
_deck[i] = Card(j, k);
++i;
}
}
}

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

#include <iostream>
#include <vector>

#include "card.h"#include "deck.h"
int main() {
Deck new_deck = Deck();
std::cout << new_deck._deck[4]._value;
return 0;
}

При попытке запустить код появляются следующие ошибки:

In file included from main.cpp:6:
./deck.h:8:27: error: expected parameter declarator
std::vector<Card> _deck(51);
^
./deck.h:8:27: error: expected ')'
./deck.h:8:26: note: to match this '('
std::vector<Card> _deck(51);
^
main.cpp:22:24: error: reference to non-static member function must be called; did you mean to call it with no arguments?
std::cout << new_deck._deck[4]._value;
~~~~~~~~~^~~~~
()
3 errors generated.
In file included from deck.cpp:8:
./deck.h:8:27: error: expected parameter declarator
std::vector<Card> _deck(51);
^
./deck.h:8:27: error: expected ')'
./deck.h:8:26: note: to match this '('
std::vector<Card> _deck(51);
^
deck.cpp:18:4: error: reference to non-static member function must be called; did you mean to call it with no arguments?
_deck[i] = Card(j, k);
^~~~~
()
3 errors generated.

2

Решение

Ваша проблема заключается в декларации _deck:

class Deck {
public:
std::vector<Card> _deck(51);

Здесь вы пытаетесь объявить _deck и вызвать конструктор, но вы не можете сделать это из инициализатора члена класса. Это можно сделать для членов данных без конструкторов, например:

class Deck {
public:
int no_of_cards = 51;
std::vector<Card> _deck;

Вам нужно будет использовать ваш конструктор для инициализации _deck (так же, как вы уже делаете:

Deck::Deck() {
_deck.reserve(51);
int i = 0;
for (int j = 0; j <= all_suits; ++j) {
//begin with 2 because card can't have value 0
for (int k = 2; k <= all_values; ++k) {
_deck.push_back(Card(j, k));
++i;
}
}
}

И оставьте свою декларацию _deck как:

class Deck {
public:
std::vector<Card> _deck;
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]