在类内部使用比较函数进行 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() 时出现问题 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

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

    我有一个显示一些文本的 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