初始化自定义类中的数组
Initializing array in custom class
我在deckofcardsclass.cpp
类文件中收到错误too many initializers
。 我已经看过几篇关于这个的帖子,但它们没有直接关系,而且我遇到的内容有点复杂,因为我正在用另一个类的实例填充数组。 它仅仅是语法错误吗? 还是初始化背后的逻辑不正确?
需要明确的是:初始化cards_数组时,实现文件中发生错误
类标头
#pragma once
#ifndef DECKOFCARDS_H_
#define DECKOFCARDS_H_
#include <array>
#include "Card.h"
class DeckOfCards
{
public:
DeckOfCards();
void printDeck();
private:
std::array<Card, 52> cards_;
};
#endif // !1
类实现
#include "stdafx.h"
#include <iostream>
#include "DeckOfCards.h"
#include "Card.h"
#include <array>
DeckOfCards::DeckOfCards()
:
cards_
{
{ Card::Diamonds, Card::Two },
{ Card::Diamonds, Card::Three },
{ Card::Diamonds, Card::Four },
{ Card::Diamonds, Card::Five },
{ Card::Diamonds, Card::Six },
{ Card::Diamonds, Card::Seven },
{ Card::Diamonds, Card::Eight },
{ Card::Diamonds, Card::Nine },
{ Card::Diamonds, Card::Ten },
{ Card::Diamonds, Card::Jack },
{ Card::Diamonds, Card::Queen },
{ Card::Diamonds, Card::King },
{ Card::Diamonds, Card::Ace },
{ Card::Hearts, Card::Two },
{ Card::Hearts, Card::Three },
{ Card::Hearts, Card::Four },
{ Card::Hearts, Card::Five },
{ Card::Hearts, Card::Six },
{ Card::Hearts, Card::Seven },
{ Card::Hearts, Card::Eight },
{ Card::Hearts, Card::Nine },
{ Card::Hearts, Card::Ten },
{ Card::Hearts, Card::Jack },
{ Card::Hearts, Card::Queen },
{ Card::Hearts, Card::King },
{ Card::Hearts, Card::Ace },
{ Card::Spades, Card::Two },
{ Card::Spades, Card::Three },
{ Card::Spades, Card::Four },
{ Card::Spades, Card::Five },
{ Card::Spades, Card::Six },
{ Card::Spades, Card::Seven },
{ Card::Spades, Card::Eight },
{ Card::Spades, Card::Nine },
{ Card::Spades, Card::Ten },
{ Card::Spades, Card::Jack },
{ Card::Spades, Card::Queen },
{ Card::Spades, Card::King },
{ Card::Spades, Card::Ace },
{ Card::Clubs, Card::Two },
{ Card::Clubs, Card::Three },
{ Card::Clubs, Card::Four },
{ Card::Clubs, Card::Five },
{ Card::Clubs, Card::Six },
{ Card::Clubs, Card::Seven },
{ Card::Clubs, Card::Eight },
{ Card::Clubs, Card::Nine },
{ Card::Clubs, Card::Ten },
{ Card::Clubs, Card::Jack },
{ Card::Clubs, Card::Queen },
{ Card::Clubs, Card::King },
{ Card::Clubs, Card::Ace } }
{}
void DeckOfCards::printDeck()
{
bool first = true;
for (auto card : cards_)
{
if (!first)
{
std::cout << ", ";
}
card.printCard();
first = false;
}
}
卡头
#pragma once
#ifndef CARD_H_
#define CARD_H_
struct Card
{
enum Suit_Type
{
Diamonds,
Hearts,
Spades,
Clubs,
} suit;
enum Value_Type
{
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight = 8,
Nine = 9,
Ten = 10,
Jack = 11,
Queen = 12,
King = 13,
Ace = 14
} value;
void printCard();
};
#endif // !CARD_H
_
你可能会发现这会拉伸你,但是如果可以用算法术语来描述填充数组或向量,我可能会这样做。
在这种情况下,我使用 constexpr 来生成数组,因为std::array
支持constexpr
构造。如果您决定使用向量,类似的方法将起作用,但您需要删除constexpr
。
#include <array>
#include <iostream>
#include <utility>
#include <random>
#include <algorithm>
struct Card
{
enum Suit_Type
{
Diamonds,
Hearts,
Spades,
Clubs,
} suit;
friend std::ostream& operator<<(std::ostream& os, Suit_Type s) {
switch (s) {
case Card::Diamonds: return os << "Diamonds";
case Card::Hearts: return os << "Hearts";
case Card::Spades: return os << "Spades";
case Card::Clubs: return os << "Clubs";
}
}
enum Value_Type
{
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight = 8,
Nine = 9,
Ten = 10,
Jack = 11,
Queen = 12,
King = 13,
Ace = 14
} value;
friend std::ostream& operator<<(std::ostream& os, Value_Type s) {
switch (s) {
case Card::Two: return os << "Two";
case Card::Three: return os << "Three";
case Card::Four: return os << "Four";
case Card::Five: return os << "Five";
case Card::Six: return os << "Six";
case Card::Seven: return os << "Seven";
case Card::Eight: return os << "Eight";
case Card::Nine: return os << "Nine";
case Card::Ten: return os << "Ten";
case Card::Jack: return os << "Jack";
case Card::Queen: return os << "Queen";
case Card::King: return os << "King";
case Card::Ace: return os << "Ace";
}
}
void printCard();
};
void Card::printCard() {
std::cout << value << " of " << suit;
}
constexpr Card card_from_index(int index) {
return {
static_cast<Card::Suit_Type>(index / 13),
static_cast<Card::Value_Type>((index % 13) + 2)
};
}
class DeckOfCards
{
public:
DeckOfCards();
void printDeck();
template<class Engine>
void shuffle(Engine&& eng) {
std::shuffle(std::begin(cards_), std::end(cards_),
std::forward<Engine>(eng));
}
private:
static constexpr int nof_cards = 52;
using deck_store = std::array<Card, nof_cards>;
template<int...Is>
constexpr static deck_store generate_deck(std::integer_sequence<int, Is...>)
{
deck_store result{ card_from_index(Is)... };
return result;
}
private:
deck_store cards_;
};
DeckOfCards::DeckOfCards()
: cards_ (generate_deck(std::make_integer_sequence<int, nof_cards>()))
{}
void DeckOfCards::printDeck()
{
bool first = true;
for (auto card : cards_)
{
if (!first)
{
std::cout << ", ";
}
card.printCard();
first = false;
}
std::cout << "n";
}
int main()
{
DeckOfCards deck;
deck.printDeck();
deck.shuffle(std::default_random_engine { std::random_device {} ()});
std::cout << "nafter shuffling:nn";
deck.printDeck();
}
相关文章:
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 如何使用自定义类型声明Arduino数组?
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- (C++)我的自定义数组无法初始化(编译错误)
- 重写自定义数组类的运算符/开始/结束
- 使用自定义对象声明shared_ptr数组时出现错误 C2664
- 为什么我的 2D 数组未定义?
- 自定义 c++ 数组在为索引赋值时会吓坏
- shared_ptr<>到数组自定义删除器(带make_shared)
- const 数组,用于在数组长度定义中使用其元素或为模板参数提供值
- C++数组类定义和实现,未在作用域中声明
- 在头文件的数组中定义资源 ID
- 如何处理C++中在数组上定义的函数
- c++和Java数组声明/定义:差异
- C++ 我知道数组长度,但想知道是否是一种更简洁的数组元素定义方法
- 为什么这组自定义对象没有根据重载的操作器<进行排序
- 使用C++数组输入定义重载函数是安全的
- 堆积或堆叠数组.用户定义的类型难题
- 通过无符号整数读取无符号字符数组未定义,因此不安全