当前位置: 首页 > 知识库问答 >
问题:

用成员函数重载布尔运算符

齐朝明
2023-03-14

我有一个这样的类:

    class AI
    {
    private:
        struct Comparator
        {
            bool operator()(const Town* lfs, const Town* rhs)
            {
                return GetHeuristicCost(lfs) > GetHeuristicCost(rhs);
            }
        };
int GetHeuristicCost(const Town* town);
    // constructor and variables
    };

GetHeuristicCost返回从town参数到路径的出口

我试图做的是为优先级队列重载布尔运算符,但它给了我错误

a nonstatic member reference must be relative to a specific object

我知道为什么它会给我这个错误,但是我不知道如何在< code>Comparator结构中使用一个非静态函数。

>

  • GetHeur在成本必须是非静态的
  • 我尝试在Town类中移动GetHeururistic成本但没有成功
  • 我需要用一个结构重载运算符,因为我需要在()上使用两个不同的bool重载,用于两种不同的情况,但参数相同(两个城镇)。换句话说,我需要结构,所以我不能这样做:

    bool operator()(const Town* lfs, const Town* rhs) { return GetHeuristicCost(lfs)

    基本上我计划有两个这样的结构:

    struct Comparator1
    {
        bool operator()(const Town* lfs, const Town* rhs)
        {
            return GetHeuristicCost(lfs) > GetHeuristicCost(rhs);
        }
    };
    
    struct Comparator2
    {
        bool operator()(const Town* lfs, const Town* rhs)
        {
            return GetHeuristicCost(lfs) + GetTotalCost (lfs, rhs) > GetHeuristicCost(rhs) + GetTotalCost (lfs, rhs);
        }
    };
    
  • 共有1个答案

    亢奇
    2023-03-14

    您需要使用指向其“外部”类实例的指针/引用来构造比较器嵌套类的实例。

    class AI
    {
    private:
        struct Comparator
        {
            const AI &outer;
    
            Comparator(const AI &o):outer(o){}
    
            bool operator()(const Town* lfs, const Town* rhs)const
            {
                return outer.GetHeuristicCost(lfs) > outer.GetHeuristicCost(rhs);
            }
        };
    
        int GetHeuristicCost(const Town* town)const;
    };
    
    // how to use in code:
    AI::Comparator comp(*this);
    priority_queue<Town*, vector<Town*>, AI::Comparator> priorityQueue(comp);
    
     类似资料:
    • 以下SSCCE说明了这种情况: 项目之前编译得很好,我用几个编译器(、、、和)再次检查了这个SSCCE,所有这些编译器都在没有任何警告的情况下编译了它(使用)。所有编译器都设置为C++11/C++0x标准。将ctor添加到中后,即使在和上也能很好地编译 使两个的非成员都显示了所有编译器中的二义性(正如预期的那样) 在查看了标准草案(和)之后,我没有找到任何使成员函数/运算符比非成员函数/运算符更匹

    • 运算符重载 对于面向对象的程序设计来说,运算符重载可以完成两个对象之间的复杂操作,比如两个对象的加法、减法等。运算符重载的原理是:一个运算符只是一个具有特定意义的符号,只要我们告诉编译程序在什么情况下如何去完成特定的操作,而这种操作的本质是通过特定的函数完成的。 重载运算符 为了重载运算符,首先要定义运算符重载函数,它通常是类的非静态成员函数或者友元函数,运算符的操作数通常也应为对象。 定义运算符

    • 问题内容: 这个问题已经在这里有了答案 : mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误? (1个答案) 8个月前关闭。 我的html: 我的rent.php文件: 当我尝试提交时,我的错误是:致命错误:在第18行的C:… \ rent.php中,调用布尔函数的成员函数execute() 电子邮件,msg_text为

    • 我的代码如下: 我一直收到错误“调用布尔值上的成员函数bind_param()”。我找遍了整个S.O.,找到了几个例子,但没有一个能解决我的问题。我在代码中没有看到任何语法或打字错误。通过使用var_dump,我知道$_POST[“url”]和$_POST[“description”]存在并被正确接收。 想法还是帮助?

    • C++ 重载运算符和重载函数 类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针"行为。运算符 -> 必须是一个成员函数。如果使用了 -> 运算符,返回类型必须是指针或者是类的对象。 运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,它们会执行其他的任务。比如,当

    • C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。 C++ 中的函数重载