在类内部使用比较函数进行 sort() 时出现问题

2023-11-22

如果你看一下我在类中的函数 CardCompare...它不起作用!但是,如果我改用 Hand.cpp 中注释掉的函数,它就可以正常工作。为什么是这样?

另外,我想知道将 CardCompare 函数保留在我的 hand 类中是否比将其保留在 Card 类中更有意义(如果可能的话)。

Hand.h

#ifndef HAND_H
#define HAND_H

#include <vector>
#include "Card.h"

class Hand {
    private:
        std::vector<Card> hand;
        int total;
        void CalculateTotal();
        bool CardCompare (Card i, Card j) {return ( i.RankInt() < j.RankInt() ); }//Does not work! :O
    public:
        Hand() {
            total = 0;
        }
        std::vector<Card> GetHand() const{ return hand;};
        void PrintHand();
        void AddToHand(Card c);

};



#endif

Hand.cpp

#include "Hand.h"
#include <iostream>
#include <algorithm>

void Hand::CalculateTotal() {
    for (int i = 0; i < hand.size(); i++) {
            std::cout << hand[i].ToString() << std::endl;
    }
}

void Hand::PrintHand() {
    for (int i = 0; i < hand.size(); i++) {
        std::cout << hand[i].ToString() << std::endl;
    }
    std::cout << std::endl;
}
/* If I place this right here, it works perfect.
bool CardCompare (Card i, Card j) {return ( i.RankInt() < j.RankInt() ); }
*/
void Hand::AddToHand(Card c) {
    hand.push_back(c);
    std::sort(hand.begin(),hand.end(),CardCompare);
}

int main() {
    Hand h;
    h.PrintHand();
    h.AddToHand(Card (2, ( Card::Suit )2 ) );
    h.PrintHand();
    h.AddToHand(Card (3, ( Card::Suit )3 ) );
    h.PrintHand();
    h.PrintHand();
    h.AddToHand(Card (1, ( Card::Suit )2 ) );
    h.PrintHand();
    h.AddToHand(Card (13, ( Card::Suit )3 ) );
    h.PrintHand();

    std::cout<< std::endl << std::endl;

    std::cout << h.GetHand()[0].ToString();
}

Card.h

#ifndef CARD_H
#define CARD_H

#include <string>

class Card {
public:
    enum Suit {
        SUIT_HEART,
        SUIT_DIAMOND,
        SUIT_CLUB,
        SUIT_SPADE
    };
    Card(int r = 1, Suit s = SUIT_HEART) : rank(r), suit(s)
    {}
    int GetRank() const { return rank; };
    Suit GetSuit() const { return suit; };
    std::string ToString() const;
    std::string SuitString() const;
    std::string RankString() const;
    int RankInt() const;


private:
    int rank;
    Suit suit;
    static const char * ranknames[];
    static const char * suitnames[];
    static const int     rankints[];
};
#endif

Card.cpp

#include <iostream>
#include "Card.h"
//#include <vector> //gtfo

const char * Card::ranknames[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
const char * Card::suitnames[] = { "Hearts", "Diamonds", "Clubs", "Spaces" };
const int    Card::rankints[]  = {11, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,10 ,10, 10 };

std::string Card::ToString() const {
    std::string s = RankString();
    s.append(" of ");
    s.append(SuitString());
    return s;
}

std::string Card::SuitString() const {
    return suitnames[suit];
}

std::string Card::RankString() const {
    return ranknames[rank-1];
}

int Card::RankInt() const {
    return rankints[rank-1];
}
 /*
int main() {

    std::vector<Card> Deck;

    for (int i = 0; i < 10 ; i++) {
        Deck.push_back(Card(i+1,(Card::Suit)((i+1)%4)));
        std::cout << Deck[i].ToString() << std::endl;
    }

    std::cout << std::endl << std::endl;
    std::random_shuffle( Deck.begin(), Deck.end() );

    for (int i = 0; i < 10 ; i++) {
            std::cout << Deck[i].ToString() << std::endl;
    }
}*/

您试图将指针传递给成员函数,因此排序无法使用它,因为它没有this指针。在你的情况下,你可以将函数更改为static:

static bool CardCompare (Card i, Card j) {return ( i.RankInt() < j.RankInt() ); }

如果将来确实需要它成为非静态成员函数,请将其绑定为boost::bind or std::bind(对于 C++0x 编译器):

std::sort(hand.begin(),hand.end(),bind(&Hand::CardCompare, this, _1, _2));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在类内部使用比较函数进行 sort() 时出现问题 的相关文章

  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 阻止文本在网址中的句点上拆分为多行

    我有一个显示一些文本的 Android TextView 它是多行的 不过 在文中 我有时也会有域名 如何阻止 TextView 将行按句点分割 例如 是否有 unicode 不间断句点 要查看包装电子邮件地址时出现的问题 请运行 andr
  • 在 2d 环境中以百分比增量将对象从向量 A 移动到 B

    我知道向量 A 和 B 的坐标 如何计算这两个向量之间的第一个点 第一个向量 X 是向量 A 和 B 之间距离的 1 所以首先我将向量 A 中的对象移动到向量 B 1 附近 所以我需要计算向量 X 它是对象的新向量 直到它到达向量 B 你要
  • 从分隔文件加载数据到 mysql 表时跳过错误行

    我使用以下查询将数据从文本文件加载到 mysql 表 LOAD DATA INFILE myFile csv INTO TABLE some table COLUMNS TERMINATED BY OPTIONALLY ENCLOSED B
  • Jetpack Compose Navigation - 将本地文件位置作为字符串传递

    我正在尝试传递音频文件位置 storage emulated 0 Android media 作为第一个屏幕中的字符串home screen到第二个屏幕detail screen 当我正常传递上面的字符串作为参数时 我收到此错误 java
  • Python 进程使用的总内存?

    Python 程序有没有办法确定它当前使用了多少内存 我看过关于单个对象的内存使用情况的讨论 但我需要的是该进程的总内存使用情况 以便我可以确定何时需要开始丢弃缓存数据 Here是一个有用的解决方案 适用于各种操作系统 包括 Linux W
  • fetch response.text() 返回待处理的承诺

    我使用 jsonplaceholder URL 测试 fetch API 但我的函数返回 Promise State Pending 我不明白为什么 function getUsers url return fetch url const
  • CSS:删除选择元素内的填充

    我试图从选择元素中删除填充 以便其中的文本与其正下方的输入元素中的文本对齐 除其他外 我还尝试过以下操作 select padding left 0 有任何想法吗 JS小提琴在这里http jsfiddle net pLSkH 2 去除te
  • 当应用程序在后台运行时,如何让我的 AVPlayer 播放?

    我已经完成了我的作业 一直在阅读这里的文档 谷歌搜索 stackoverflowing 但是当用户让应用程序进入后台时仍然无法让我的声音保持不变 到目前为止我所做的 将 UIBackgroundModes 音频添加到 plist 文件中 首
  • 如何搜索redis哈希中的关键模式?

    我有一个哈希表 其键的模式为 USER TEL 如下所示 bob 123456 Some address mary 567894 other address john 123456 third address 现在 我想获取密钥中具有相同电
  • 使用 atos 通过 dSYM 确定崩溃的方法名称

    我有一个来自用户的控制台堆栈 不是崩溃报告 我试图确定我的应用程序中的哪个方法调用是最后一个站着的人 我知道他们使用的是哪个版本的应用程序 并且我有该发布 调试版本的副本 以及存档副本的 dSYM 文件 但是 当我尝试使用atos吐出内存地
  • React Native 响应式字体大小

    我想问一下如何反应原生处理或做响应式字体 例如 在 iphone 4s 中 我的 fontSize 14 而在 iphone 6 中 我的 fontSize 18 您可以使用像素比 例如 var React require react na
  • SELECT * INTO 在 SQL Server 2008 中保留 ORDER BY,但在 2012 中不保留

    在2008年和2012年执行以下SQL 在2008年执行时 返回的结果是正确的排序顺序 2012 年 排序顺序不再保留 这是已知的变化吗 2012 年是否有保留排序顺序的解决方法 CREATE TABLE MyTable Name VARC
  • 连接在不活动一段时间后挂起

    在我的应用程序中 Spring 管理用于数据库访问的连接池 Hibernate 使用这些连接进行查询 乍一看 我对池没有任何问题 它可以在并发客户端和只有一个连接的池中正常工作 我可以执行很多查询 所以我认为我 或Spring 不会留下开放
  • 使用layout_gravity =“bottom”放置在LinearLayout的底部

    我想在 LinearLayout 的底部放置一个布局 但我似乎无法让它工作 我知道我可以使用RelativeLayout来做到这一点 但我应该能够使用LinearLayout 不是吗 EDIT 事实上这比我想象的更令人困惑 下面的布局已简化
  • 使用折叠工具栏和选项卡滚动

    我正在尝试制作一个布局CollapsingToolbarLayout其中有scroll exitUntilCollapsed标志 和一个TabLayout其中有scroll enterAlways滚动标志属性 基本上我希望我的工具栏被固定并
  • Keras 中每个时期的训练准确性是如何确定的?

    我正在 Keras 中训练一个模型 如下所示 model fit Xtrn ytrn batch size 16 epochs 50 verbose 1 shuffle True callbacks model checkpoint val
  • 是否可以关闭/管理 IIS 上的 SSL 连接/会话?

    我试图找出 IIS 中是否有某种 API 或控件允许我以某种方式控制 SSL 会话 例如关闭会话或要求重新身份验证 底线我问是否有人知道管理从 C 到 IIS 7 的 SSL 连接的方法 类似于 Tomcat 7 的方法 Invalidat
  • 无法选择 UIAlertController 中的按钮顺序

    我的印象是 如果正常操作是破坏性操作 而另一个是 UIAlertController 中的取消操作 则破坏性操作应该位于左侧 取消操作应该位于右侧 如果正常操作不是破坏性的 那么正常操作应该在右侧 取消应该在左侧 也就是说 我有以下内容 v
  • 使用 Sass 的媒体查询无法编译

    我在使用媒体查询混合编译 Sass 文件时遇到错误 我遵循了几个教程 但它无法编译 我在用着Sass 3 3 0 alpha 67 Bleeding Edge 这是我的代码 Included at the end mixin mobile
  • 在类内部使用比较函数进行 sort() 时出现问题

    如果你看一下我在类中的函数 CardCompare 它不起作用 但是 如果我改用 Hand cpp 中注释掉的函数 它就可以正常工作 为什么是这样 另外 我想知道将 CardCompare 函数保留在我的 hand 类中是否比将其保留在 C