2014-12-02 169 views
0

我试图在C++中重载==运算符。比较同一类的两个对象

#include <string> 

using namespace std; 

namespace date_independent 
{ 
    class clock 
    { 
     public: 
      int clockPair[2] = {0,0}; 
      operator string() const 
      { 
       string hourString; 
       string minString; 
       if(clockPair[0]<10) 
       { 
        hourString = "0"+to_string(clockPair[0]); 
       } 
       else 
       { 
        hourString = to_string(clockPair[0]); 
       } 
       if(clockPair[1]<10) 
       { 
        minString = "0"+to_string(clockPair[1]); 
       } 
       else 
       { 
        minString = to_string(clockPair[1]); 
       } 
       return hourString+":"+minString; 
      }; 
      bool operator ==(const clock&clockOne, const clock&clockTwo) const 
      { 
       return string(clockOne)==string(clockTwo); 
      }; 
    }; 
}; 

还有更多的代码比我包括,但这是重要的部分。我需要它,以便==操作员可以比较类clock的两个对象。例如,object1==object2。有没有人可以帮助我?

+0

你的问题是什么? – moooeeeep 2014-12-02 07:17:09

+0

相关:http://stackoverflow.com/q/4421706/1025391 – moooeeeep 2014-12-02 07:20:58

回答

5

==这样的二元运算符可以作为具有单个参数的成员函数重载(this是左边的操作数,而参数是右边的),或者作为具有两个参数的非成员函数两个操作数的参数。

因此,无论

    (如果你一直在标题中定义的定义移动到一个源文件或声明它 inline
  • 移动类的声明之外的运营商申报;或
  • friend添加到定义中,以便它在周围的名称空间中声明一个非成员;或
  • 从成员函数中删除第一个参数,使用this来代替。

作为会员,它看起来像

bool operator==(const const & clockTwo) const { 
    return string(*this) == string(clockTwo); 
} 

您也可能希望将两个整数值直接比较进行保存字符串的代价。你也应该在函数和命名空间定义之后删除流氓;,尽管大多数现代编译器不应该反对它们的存在。

1

已经编写了比较函数以取两个clock对象并对它们进行比较,所以它应该是非成员函数(在类定义之后),而不是const限定符。

bool operator==(const clock& clockOne, const clock& clockTwo) 
{ 
    return string(clockOne) == string(clockTwo); 
} 

当你在类定义内的操作员,左手参数隐式地提供给你(这是*this),所以如果你想有实现它你需要的东西,如:

bool operator==(const clock& clockTwo) const 
{ 
    return string(*this) == string(clockTwo); 
} 

不过,这不是推荐==,如果你有说从其他类型的T一个隐含的构造函数,你将无法写代码翼my_t == my_clock与成员版本,除非T提供一个合适的比较运算符(clockstring)。非会员运营商提供更多对称操作。

1

虽然你的问题措辞不佳,但我相信你会问为什么你定义的操作符不工作?

如果您将运算符定义为类的成员,那么它只需要一个参数。例如:

​​

当你定义操作为免费功能(不作为类的一部分),那么您需要定义两个参数:

class clock { 
    // ... class declaration ... 
}; 

bool operator ==(const clock& lhsClock, const clock& rhsClock) 
{ 
    return string(lhsClock) == string(rhsClock) 
} 

哪里比较会看像这样:

if (lhsClock == rhsClock) // ... do something ... 
1

重载可以在类定义内部或外部完成。如果你想在里面做,该函数只收到一个参数。您应该将this与该参数进行比较。

bool operator ==(const clock&clockTwo) const 
{ 
    return string(*this)==string(clockTwo); 
} 

注意参数后const,这意味着你将不会改变this里面的功能。另一方面,如果你想在类定义之外做它,它需要两个参数,你应该比较它们。

bool operator ==(const clock&clockOne, const clock&clockTwo) 
{ 
    return string(clockOne)==string(clockTwo); 
} 

另外请注意,这将是更快地clockPair比较的对象,而不是使串并比较它们。