关于Operator的问题

wjf8882300 2011-04-10 11:17:42

#include <string>
#include <vector>
#include <algorithm>

using std::string;
using std::vector;

typedef struct tagNode
{
tagNode()
{
}

tagNode(string a,int b)
{
this->a = a;
this->b = b;
}

bool operator ==(const tagNode& node)
{
return (this->a == node.a && this->b == node.b);
}
//感觉这边不太妥,该如何改呢?
bool operator ==(const tagNode* const node)
{
return (this->a == node->a && this->b == node->b);
}

string a;
int b;

}Node,*pNode;

int main(int argc, char* argv[])
{
Node node1("hello",0);
Node node2("hello",0);

pNode pnode1 = new Node("hello",0);
pNode pnode2 = new Node("hello",0);

//起作用了,调用了bool operator ==(const tagNode& node)
if(node1==node2)
printf("Node:equal\n");

//不起作用,未调用bool operator ==(const tagNode* const node)
if(pnode1==pnode2)
printf("pNode:equal\n");

delete pnode1;
delete pnode2;

getchar();

return 0;
}
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
huer0625 2011-04-28
  • 打赏
  • 举报
回复
上面find的模板来源:http://www.cplusplus.com/reference/algorithm/find/
huer0625 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wjf8882300 的回复:]
vector<pNode> vpnd;
vector<pNode>::iterator iter;
pNode pnode1 = new Node("hello",0);
//寻找vector中是否存在对象pnode1,这个默认的就是指针间的比较。
iter = std::find( vpnd.begin(),vpnd.end(),pnode1);
[/Quote]
指针是内置类型,上面的指针已经提供了==比较,好像不存在lz所说的问题。find函数的模板定义如下:
template<class InputIterator, class T>
InputIterator find ( InputIterator first, InputIterator last, const T& value )
{
for ( ;first!=last; first++) if ( *first==value ) break;
return first;
}

这里的T类型是pNode,所以*first的类型也是pNode,*first == value相当于两个指针变量在比较它们的地址。
wjf8882300 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]
if(pnode1==pnode2)
你这里只是一个指针地址的比较
要使用那也是*pnode1==*pnode2
[/Quote]

这个提醒了我,感觉我那个指针比较倒是有点多余了。

[Quote=引用 5 楼 hqin6 的回复:]
lz想要指针也使用那个对比么?那就再重载下指针的operator吧
[/Quote]

顺便问下指针的operator怎么重载?
太乙 2011-04-10
  • 打赏
  • 举报
回复
lz想要指针也使用那个对比么?那就再重载下指针的operator吧
maoxing63570 2011-04-10
  • 打赏
  • 举报
回复
你左操作数是this,但是你比较的时候又用的两个都是指针,还有就是即使你把它做成全局也是不行的,因为重载操作符要求有一个参数为class type,但是你也较的是两个指针类型
pengzhixi 2011-04-10
  • 打赏
  • 举报
回复
if(pnode1==pnode2)
你这里只是一个指针地址的比较
要使用那也是*pnode1==*pnode2
maoxing63570 2011-04-10
  • 打赏
  • 举报
回复
if(pnode1==pnode2)
printf("pNode:equal\n");

你的 bool operator ==(const tagNode* const node)
左操作数是this,一定要注意这点
bargio_susie 2011-04-10
  • 打赏
  • 举报
回复
你pnode1是struct tagNode *类型的。。
相当于两个指针的比较,当然没调用到赋值操作符了
wjf8882300 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huer0625 的回复:]
对于你的代码,我说以下三点:
第一:

C/C++ code
bool operator ==(const tagNode* const node)
{
return (this->a == node->a && this->b == node->b);
}

这对代码的含义是:Node 和 PNode类型判断是否相等,这跟你要……
[/Quote]

说了很具体,但是我之所以要使用指针对比也是因为有场合的,比如下面这种情况:
vector<pNode> vpnd;
vector<pNode>::iterator iter;
pNode pnode1 = new Node("hello",0);
//寻找vector中是否存在对象pnode1,这个默认的就是指针间的比较。
iter = std::find( vpnd.begin(),vpnd.end(),pnode1);

当然在这里指针间的比较没有什么意义,我也采用其他方法解决了。同样谢谢你的回答。
huer0625 2011-04-10
  • 打赏
  • 举报
回复
对于你的代码,我说以下三点:
第一:
  bool operator ==(const tagNode* const node)
{
return (this->a == node->a && this->b == node->b);
}

这对代码的含义是:Node 和 PNode类型判断是否相等,这跟你要的是两个指针对象的比较的意图违背。
对此,我该正了代码,尝试去实现你想要的功能,代码如下:
bool operator==(const pNode n1, const pNode n2)
{
return (*n1 == *n2);
}


但这同样也是失败的代码,在编译的时候,一直提示:
node.cpp:45: error: ‘bool operator==(tagNode*, tagNode*)’ must have an argument of class or enumerated type

后来查找相关的资料中知道如下事实:
内置类型不允许重载操作符,而指针正好是内置类型,所以上面这样重载是错误的。为了避免内置类型被重载,c++要求重载操作符必须具有至少一个的类类型或者枚举类型的操作数。这也正是上面那条编译错误提示的含义。
第二点:有个概念,指针相等和对象相等是不一样的概念。两个对象相等,一般是指对象具备的成员变量的指相等;指针相等是指两个指针指向内存的地址相等,对于同种类型的对象,我们可以认为指针相等,那么这两个对象相等,其实这两个对象是一个对象,那必然相等。反过来,如果两个对象相等,它们的所在的内存完全可以在不同的地方。所以我们不使用指针相等来做为对象相等的判断依据。因为这个相等并不是等价条件。
第三点:如果你想要比较两个指针指向的对象是否相等,最直接的方法是对指针进行引用操作。比如:
if( *pnode1 == *pnode2)
printf("pNode:equal\n");

这样即可。不用再编写额外的函数,它会直接调用以下函数:
bool operator ==(const tagNode & node)
{
return (this->a == node.a && this->b == node.b);
}

附录:
参考文献: c++primer 第四版 (中文版) 14.1重载操作符的定义-2. 重载操作符必须具有一个类类型操作数(page431)。
huer0625 2011-04-10
  • 打赏
  • 举报
回复
对于你的代码,我说以下三点:
第一:
  bool operator ==(const tagNode* const node)
{
return (this->a == node->a && this->b == node->b);
}

这对代码的含义是:Node 和 PNode类型判断是否相等,这跟你要的是两个指针对象的比较的意图违背。
对此,我该正了代码,尝试去实现你想要的功能,代码如下:
bool operator==(const pNode n1, const pNode n2)
{
return (*n1 == *n2);
}


但这同样也是失败的代码,在编译的时候,一直提示:
node.cpp:45: error: ‘bool operator==(tagNode*, tagNode*)’ must have an argument of class or enumerated type

后来查找相关的资料中知道如下事实:
内置类型不允许重载操作符,而指针正好是内置类型,所以上面这样重载是错误的。为了避免内置类型被重载,c++要求重载操作符必须具有至少一个的类类型或者枚举类型的操作数。这也正是上面那条编译错误提示的含义。
第二点:有个概念,指针相等和对象相等是不一样的概念。两个对象相等,一般是指对象具备的成员变量的指相等;指针相等是指两个指针指向内存的地址相等,对于同种类型的对象,我们可以认为指针相等,那么这两个对象相等,其实这两个对象是一个对象,那必然相等。反过来,如果两个对象相等,它们的所在的内存完全可以在不同的地方。所以我们不使用指针相等来做为对象相等的判断依据。因为这个相等并不是等价条件。
第三点:如果你想要比较两个指针指向的对象是否相等,最直接的方法是对指针进行引用操作。比如:
if( *pnode1 == *pnode2)
printf("pNode:equal\n");

这样即可。不用再编写额外的函数,它会直接调用以下函数:
bool operator ==(const tagNode & node)
{
return (this->a == node.a && this->b == node.b);
}

附录:
参考文献: c++primer 第四版 (中文版) 14.1重载操作符的定义-2. 重载操作符必须具有一个类类型操作数(page431)。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧