如何在 C++ 中创建一个 class 是另一个 class 的向量?
How can I create a class that is a vector of another class in C++?
感谢阅读我的问题。
我正在尝试开始编写一个使用一副纸牌的程序,因为我想了解如何使用 classes。我决定创建一个 class 来存储西装和一个值,如下所示:
#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;
}
然后我决定创建一副牌组 class,并在其中 class 通过分配 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.
老实说,我不太确定发生了什么。我非常关注我在网上看到的一个 classes 的例子。如果有人可以帮助我找到问题所在,将不胜感激。对不起,我对此有点陌生,可能犯了一些愚蠢的错误。非常感谢您花时间和耐心阅读本文并帮助我。
你的问题在于_deck
的声明:
class Deck {
public:
std::vector<Card> _deck(51);
在这里您试图声明 _deck
并调用构造函数,但您不能从 class 成员初始化程序中这样做。可以为没有构造函数的数据成员执行此操作,例如:
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;
感谢阅读我的问题。
我正在尝试开始编写一个使用一副纸牌的程序,因为我想了解如何使用 classes。我决定创建一个 class 来存储西装和一个值,如下所示:
#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;
}
然后我决定创建一副牌组 class,并在其中 class 通过分配 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.
老实说,我不太确定发生了什么。我非常关注我在网上看到的一个 classes 的例子。如果有人可以帮助我找到问题所在,将不胜感激。对不起,我对此有点陌生,可能犯了一些愚蠢的错误。非常感谢您花时间和耐心阅读本文并帮助我。
你的问题在于_deck
的声明:
class Deck {
public:
std::vector<Card> _deck(51);
在这里您试图声明 _deck
并调用构造函数,但您不能从 class 成员初始化程序中这样做。可以为没有构造函数的数据成员执行此操作,例如:
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;