c++ - 如何在 C++ 中打乱对象 vector

标签 c++ std shuffle

我是 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/

相关文章:

java - 将一个数组的每个元素乘以另一个数组的每个元素并对新的非常大的数组进行排序

c++ - Windows FormatMessage 的安全/灵活外观

c++ - 有什么理由 find_if、for_each、count 等不需要 std::?

java - 在java中可逆地改组一个int数组

c++ - boolalpha大写

c - 当你给一个 C 标准函数一个空字符串时会发生什么?

c++ - std::find 不使用我定义的 == 运算符

javascript - 如果在 javascript 中具有值,则禁用数组

java - 集合随机播放方法具有空对象

c++ - lambda 函数中的 max_element