我是 C++ 编程新手,正在尝试制作一个二十一点游戏,目的是让逻辑正常工作,然后使用一些代码制作图形版本。
我的代码如下,Visual Studio 表示未发现任何问题,但当我尝试编译代码时,出现以下错误:
严重性代码描述项目文件行抑制状态 错误 C2672“交换”:找不到匹配的重载函数 blackJack C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\include\utility 78
#include <iostream>
#include <string>
#include <map>
#include <string_view>
#include <vector>
#include <algorithm>
#include <random>
#include <iterator>
#include <cstdlib>
#include <utility>
class card
{
public:
std::string suite;
char pictureCard = 'n';
int value = 0;
const int numberOfDecks = 1;
void setCardValue(const int& value, std::string suite, char pictureCard);
void getDeck();
void setDeck(const int& numberOfDecks);
void shuffle();
std::vector <card> v;
};
void::card::setCardValue(const int& value, std::string suite, char pictureCard)
{
this->value = value;
this->suite = suite;
this->pictureCard = pictureCard;
}
void::card::setDeck(const int& numberOfDecks)
{
card c1;
for (int n = 0; n < numberOfDecks; n++)
{
int j = 2;
for (int i = 0; i < 9; i++) //set Numbered cards
{
c1.setCardValue(j, "Hearts", 'N');
v.push_back(c1);
c1.setCardValue(j, "Clubs", 'N');
v.push_back(c1);
c1.setCardValue(j, "Diamonds", 'N');
v.push_back(c1);
c1.setCardValue(j, "Spades", 'N');
v.push_back(c1);
j++;
}
for (int p = 0; p < 4; p++) //set Pictured cards
{
char N = 'N';
if (p == 0) { N = 'J'; }
else if (p == 1) { N = 'Q'; }
else if (p == 2) { N = 'K'; }
else if (p == 3) { N = 'A'; };
c1.setCardValue(10, "Hearts", N);
v.push_back(c1);
c1.setCardValue(10, "Clubs", N);
v.push_back(c1);
c1.setCardValue(10, "Diamonds", N);
v.push_back(c1);
c1.setCardValue(10, "Spades", N);
v.push_back(c1);
}
}
int seed = 1;
std::default_random_engine e(seed);
std::shuffle(v.begin(), v.end(), e);
}
void card::getDeck()
{
for (auto it = begin(v); it != end(v); ++it)
{
std::cout << it->value << it->suite << it->pictureCard << std::endl;
}
std::cout << v.size() << std::endl;
}
int main()
{
card c2;
c2.setDeck(6);
c2.getDeck();
return 0;
}
如果这是一个非常基本的错误,请提前道歉,但似乎无法弄清楚,因为我的调试技能也很基本。
最佳答案
如果您查看错误消息上方和下方的几行,您的编译器应该告诉您程序中的哪一行导致了级联错误:
t.C:76:17: required from here
/usr/include/c++/12/bits/stl_algobase.h:182:11: error: no matching function for call to ‘swap(card&, card&)’
182 | swap(*__a, *__b);
第 76 行是对 std::shuffle
的调用。
const int numberOfDecks = 1;
您的card
类有一个非静态const
成员。这会自动从类中删除默认的赋值和移动运算符。默认情况下,您不能将一张 card
分配给另一张卡片,就像那样,因为根据定义,这意味着一个对象的 const
成员会被神秘地替换为另一个对象的成员值。正如斯波克先生所说:“这不符合逻辑”。
您需要删除 const
类成员,或者为 card
类定义您自己的 operator=
重载,该重载可以执行任何操作使用您的 card
类来了解 =
要做的事情。
关于c++ - 如何在 C++ 中打乱对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75545550/