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;
}