2014-05-13 76 views
1

我有需要实现运营商==和返回类型是布尔类。我不确定下面的代码是实现它的正确方法。正确的方式

//MyTest.hpp文件

class Test { 
public: 

    Test(); 
    virtual ~Test(); 

    int x,y; 

    bool operator==(const Test &v); 

}; 

// MyTest.cpp file 

bool Test::operator==(const Test &v) { 
    return (x== v.x) && (y==v.y); 
} 

即使代码编译为实现我们需要使用模板这种标准方式。 我应该用模板的方式实现类似下面的代码:

template <class T> 
bool operator==(const T &v); 
+3

要使用模板是不是标准的方式。 – juanchopanza

+0

你看过http://www.cplusplus.com/doc/tutorial/templates/吗? – OnlineCop

+0

@juanchopanza - 我已编辑的示例代码.. – user1291401

回答

1

正如其他人所说,使用模板没有任何理由这样做既不是标准也不推荐。但是假设你想operator==更像默认的比较运营商之一,您应该将其标记const(否则你不能比较两个const Test)像这样

class Test { 
public: 
    Test(); 
    virtual ~Test(); 

    int x,y; 

    bool operator==(const Test &v) const; 
}; 

// MyTest.cpp file 

bool Test::operator==(const Test &v) const { 
    return (x== v.x) && (y==v.y); 
} 

,或者使它成为一个自由函数(在同一个命名空间对于ADL)以两个const Test &(优选的),像这样

class Test { 
public: 
    Test(); 
    virtual ~Test(); 

    int x,y; 
}; 

bool operator==(const Test &a, const Test &b); 

// MyTest.cpp file 

bool operator==(const Test &a, const Test &b) { 
    return (a.x==b.x) && (a.y==b.y); 
} 

如果需要私有成员的任何访问自由功能总是可以被标记friend。在简单的情况下,例如在这个例子中的情况下,将其定义在标题中并将其标记为inline可能是有利的。

+0

感谢先生的例子! – user1291401

1

请不要使用模板匹配任何东西:

template <class T> 
bool operator==(const T &, const T &); 

那一个将让你在各种麻烦!

+0

ok..i现在已编辑的代码..它返回布尔值。 – user1291401

+0

@ user1291401注释在错误的位置 –

4

除非需要,不要使用模板。 Test可以比较是否合理?我很怀疑。

也没有“标准方式”,因为标准没有强加一个严格的方法来实现operator==(我认为它提到了返回类型的一些东西,但我怀疑它实际上是否强制任何东西)。

这是一个好主意,使其返回bool,使它做什么,人们期待它(以有意义的方式比较两个对象)。

最后,你应该标记您的当前const

bool operator==(const Test &v) const; 

除非实际修改调用对象,这绝对是你不希望它做的事。

+2

顺便提一句,实现'operator!='也可能是一个好主意。 –

+2

@MatteoItalia,是的。可能用'operator =='来表示。像'bool operator!=(T const&a,T const&b){return!(a == b); }'。 – Shoe