C++ 是否可以传递std::array的引用?

C++ 是否可以传递std::array的引用?,c++,c++11,C++,C++11,所以我试图编写一个函数来改变它外部的数组,就像把一个值作为引用传递给一个函数一样。 这是我的密码: std::array<Card, 52> deck {}; std::array<Card, 52> &deckRef = deck; initializeDeck(deckRef); printDeck(deckRef); std::数组组{}; 标准::阵列&deckRef=甲板; 初始化确认(deckRef); 打印甲板(deckRef); 及 void

所以我试图编写一个函数来改变它外部的数组,就像把一个值作为引用传递给一个函数一样。 这是我的密码:

std::array<Card, 52> deck {};
std::array<Card, 52> &deckRef = deck;

initializeDeck(deckRef);
printDeck(deckRef);
std::数组组{};
标准::阵列&deckRef=甲板;
初始化确认(deckRef);
打印甲板(deckRef);

void initializeDeck(标准::数组组){
int16_t卡号{0};
对于(int countsuit{0};countsuit
printDeck打印垃圾。但是,如果我在initializeDeck()中添加一个printCard(),它可以很好地打印所有卡片,但是它不会存储在main()中的原始数组中

当我这样做的时候,我得到了这个错误

void initializeDeck(std::array<Card, 52>& deck)

undefined reference to `initializeDeck(std::array<Card, 52u>)'|
void initializeDeck(std::array&deck)
对“initializeDeck(std::array)”的未定义引用|
提前谢谢!
提前谢谢

您需要传递deck作为引用,以便函数的外部具有更改。i、 e.代码应为

void initializeDeck(std::array<Card, 52>& deck){
void initializeDeck(std::array&deck){

对主题稍作扩展,但如果您愿意,可以在编译时生成甲板:(此示例需要c++14,但c++11只需稍加努力即可完成)

#包括
#包括
#包括
#包括
enum级套装{黑桃、钻石、梅花、红桃};

std::ostream&operator是否尝试将引用传递给
std::array
?您应该已经发现您可以传递引用。您没有传递引用。您仍在按值传递它。函数需要将参数作为引用接收。我已经尝试过了,当我这样做时,会出现此错误。未定义对`initializeDeck(std::array)的引用“|确保更改声明和定义以引用。是的,我现在觉得自己很笨。非常感谢,我猜这是初学者的错误!@KarimEssam如果出于其他原因不需要原型,请将其删除,并将函数移到文件中首次使用之前。这样,您就不必担心保留两部分了。”ckstep。这不适合初学者!@BarryTheHatchet教他们去接触星星,Barry。这就是我说的。-)为什么
case
呢?带枚举数作为索引的静态数组不也能工作吗?需要更少的代码吗?而且
随机洗牌
被弃用并将被删除soon@Revolver_Ocelot重新随机洗牌,你完全正确,但我觉得由
random\u设备初始化的
random\u引擎
的引入可能会分散我的注意力,因此为了简单起见,我选择了不太正确的方法。重新查找表,好吧,一个开关允许编译器做最有效的事情,而一个查找表迫使它沿着一条路径进行。无论哪种方式,C++要求我们重复自己,这是一个耻辱,所以两种方法都需要同等的照顾。确实应该有一个“命名EnUM”在C++ 11 imo。
void initializeDeck(std::array<Card, 52>& deck){
#include <iostream>
#include <iterator>
#include <algorithm>
#include <array>

enum class Suit { Spades, Diamonds, Clubs, Hearts };
std::ostream& operator<<(std::ostream& os, Suit s) {
    switch (s) {
        case Suit::Spades: return os << "spades";
        case Suit::Diamonds: return os << "diamonds";
        case Suit::Clubs: return os << "clubs";
        case Suit::Hearts: return os << "hearts";
    }
}

enum class Rank { Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace };
std::ostream& operator<<(std::ostream& os, Rank r) {
    switch (r) {
        case Rank::Two: return os << "two";
        case Rank::Three: return os << "three";
        case Rank::Four: return os << "four";
        case Rank::Five: return os << "five";
        case Rank::Six: return os << "six";
        case Rank::Seven: return os << "seven";
        case Rank::Eight: return os << "eight";
        case Rank::Nine: return os << "nine";
        case Rank::Ten: return os << "ten";
        case Rank::Jack: return os << "jack";
        case Rank::Queen: return os << "queen";
        case Rank::King: return os << "king";
        case Rank::Ace: return os << "ace";
    }
}

struct Card {
    Suit suit;
    Rank rank;
};

std::ostream& operator<<(std::ostream& os, const Card& c) {
    return os << c.rank << " of " << c.suit;
}

constexpr Card make_card(size_t index)
{
    return Card {
        static_cast<Suit>(index / 13),
        static_cast<Rank>(index % 13)
    };
}


using Deck = std::array<Card, 52>;

template<size_t...Is>
constexpr Deck generate_deck_impl(std::index_sequence<Is...>)
{
    return { make_card(Is)... };
}

constexpr Deck generate_deck()
{
    return generate_deck_impl(std::make_index_sequence<52>());
}


int main()
{
    using namespace std;
    auto deck = generate_deck();
    std::copy(begin(deck), end(deck), ostream_iterator<Card>(cout, ", "));
    cout << endl;

    random_shuffle(begin(deck), end(deck));
    std::copy(begin(deck), end(deck), ostream_iterator<Card>(cout, ", "));
    cout << endl;
}