【问题标题】:overloading operator function==重载运算符函数==
【发布时间】:2014-03-04 08:51:53
【问题描述】:

我不熟悉 C++,我的导师提供了一个让我感到困惑的函数

     operator long (void);
      long operator == (Base & base) {
       return ! strcmp (name, base);
          }

据我所知,运营商正在对 2 个 Base 对象进行比较?还是我错了? 当我调用函数本身时,它告诉我没有这样的函数调用。

我调用它返回此错误的函数

没有匹配函数... operator(Base*&,Base&)

【问题讨论】:

  • 我认为您对函数的声明与您的实际方法定义非常不同。这就是问题出现的原因。

标签: c++ operator-overloading


【解决方案1】:

该函数未命名为 operator,而是命名为 operator==。这是一个overloaded comparison operator。你可以这样称呼它:

Base a, b;
if(a==b) // <-- this is the function call
   std::cout<<"equal"<<std::endl;
else
   std::cout<<"not equal"<<std::endl;

当然,当函数是Base 类的成员 时,情况就是如此。您没有提供所有代码,所以我猜是。

最重要的是,代码的第一行是另一个重载运算符(将类转换为long)的声明,并且它的实现在其他地方(可能)提供。

【讨论】:

    【解决方案2】:

    有两种重载运算符的方法。

    1.它可以是类的成员或

    2.可以在课外

    调用重载运算符函数的方式取决于您使用的方式并有所不同。 在您的情况下,它似乎在课堂内,但我认为声明中有问题并且没有正确声明。 检查此问题链接可能有用 Operator overloading outside class

    long operator == (Base &base); // this should be your declaration inside your class
    
    //definition
    long operator == (Base &base){
      return !strcmp(name,base.name); 
    }
    

    你可以简单地通过你的类对象调用它

    obj1==obj2 or obj1.operator==(obj2)
    

    觉得这很有用

    【讨论】:

    • 请注意:如果您在比较字符串相等性,那么它应该是 !strcmp()。
    【解决方案3】:

    您可以通过两种方式定义此运算符。首先是在您的 Base 类中。

    class Base
    {
        public:
        long operator==(Base &base);
    }
    
    long Base::operator==(Base &base)
    {
        ...
    }
    

    第二个在任何类之外,

    long operator==(Base &left, Base &right)
    {
        ...
    }
    

    请注意,在任何类之外声明的必须有两个参数,而在类内声明的必须只有一个。当你这样称呼它时,

    base1 == base2;
    

    如果使用第一个版本,base1是调用操作符的对象,base2作为参数传递。

    如果你使用第二个版本,base1作为左边传递,base2作为右边传递。

    根据您的错误消息,我想您尝试使用我在此示例中编写的第二种类型,就好像它是第一种类型一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多