| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2742 人关注过本帖
标题:重载输入输出运算符的问题
只看楼主 加入收藏
zorro2zzz
Rank: 1
等 级:新手上路
威 望:1
帖 子:96
专家分:0
注 册:2005-9-11
收藏
得分:0 
所以我现在用vc……

编程是啥东西,让俺瞧瞧……
2005-09-12 09:39
navy1860
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-12
收藏
得分:0 
补充一下:对于友元函数的说明和友元类的说明是一样的!!否则友元函数不可用~!

[此贴子已经被作者于2005-9-12 10:36:40编辑过]


2005-09-12 10:24
navy1860
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-12
收藏
得分:0 
好郁闷,我编辑自己的帖子竟然把刚发的给覆盖掉我,我花了好长时间发的啊,斑竹能把我刚发的帖子恢复过来吗》郁闷,郁闷
2005-09-12 10:41
navy1860
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-12
收藏
得分:0 
郁闷死了,我重新发一个:



楼主的问题我也遇见过,自己琢磨后发现这应该是友元的使用不当引起的,希望大家来指教。我把楼主的代码简化了一下,只重载operator<<()输出函数,并把int a,int b声明为private成员(一会可以看到错误)代码如下:

//---------------------------code beings

#include <iostream>

using namespace std;



lass OpoverClass

{

friend ostream& operator<<(ostream&,const OpoverClass&);

public:

OpoverClass (int i=0,int j=0){a=i;b=j;};

private:

int a;

int b;

};



 ostream& operator<<(ostream& osObject,const OpoverClass& right)

{

osObject<<"("<<right.a<<","<<right.b<<")";

return osObject;

}



int main()

{

OpoverClass u(23,46);

OpoverClass v;

cout<<"u="<<u<<endl;

return 0;

}

//---------------------------ends

编译以上的代码,编译器会报三个错误:1-operator<< ambiguous   2.cannot access private member 'a' 3.cannot access private member 'b'

问题解决如下:

在using namespace std;之后下一行加上

class OpoverClass;

extern ostream& operator<<(ostream&,const OpoverClass&);

再编译,程序一切正常!

--------------------------

问题所在,都是友元使用不当引发的错误。大家看看 Bjarne Stroustrup的”The C++ Programming
Language”中对友元的说明是这样的:‘一个友元类必须或者是在外围作用域里先行声明的,或者是在将它作为友元的那个类的直接外围的非类作用域里定
义过的。在外围的最内层名字空间作用域之外的作用域不在考虑之列。’所以自己的问题就很明了了。同样,对友元函数的说明也是一样的道理:一个友元函数或者
需要在某个外围作用域里显示声明,否则久无法调用这个友元函数了。具体的请大家看看这本书的P249.

现在问题清楚了吗?

------------------------------

接下来我分析了一下刚提及的三个错误,由于友元使用的不当,导致我们明明声明了函数 ostream&
operator<<(ostream&,const
OpoverClass&);为类OpoverClass的友元,但是仍然不能直接访问类的私有成员。就有了2,3的错误提示!因为由于友元的使
用不当,造成这样的声明friend ostream& operator<<(ostream&,const
OpoverClass&);会有问题,估计编译器把接下来的函数定义

ostream& operator<<(ostream& osObject,const OpoverClass& right)

{

osObject<<"("<<right.a<<","<<right.b<<")";

return osObject;

}

当成了全局函数来看待,全局函数当然是不能直接访问私有成员啦!

至于错误一,operator<<()ambiguous我自己也想不明白,按道理,重载函数参数表中的OpoverClass&
right
.参数是自己定义的类的引用啊,怎么会和std名字空间中原有的输出函数参数表冲突呢(污染名字空间好像也没有吧)。不明白??我不管它,我也把它归结为
是由于之前友元的使用不当引起的!!那为DX知道,麻烦指点一下!~!

------------------------------------

总结:以上的结果是在VC6.0中得出来得,别得编译器我没试过。可能不同得编译器会不一样,看它对C++规范的严格支持程度了。自己之前对友元的理解也很模糊,这才发现自己应该好好看看书了,呵呵~!
2005-09-12 11:08
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
navy1860, 都是多此一举, 你们别为了那个C++Builder而烦恼了, 把那个C++ Builder 扔到垃圾桶里去. 你或者下载GCC, 或者下载DEV, 没有比GCC 更符合C++ 标准的了, 这是行内一致公认的. 用Dev去编译一下吧, 你的程序根本没错, 那是C++ Builder 的Bug, 你应该写个Email 给Borland, 告诉他, 你们的编译器有Bug. Borland 唯一做得好的一个IDE 是JBuilder, 因为它是只不过用了Sun的JDK, 其余的只是一个界面而已. 让他自己写Compiler, 你别指望他.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-13 02:26
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
得分:0 
肯定是编译器标准的问题, VC6.0是垃圾, 很多不支持标准, 建议用.NET的VC++

2005-09-13 08:28
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
我没有正版的 VS NET,等以后有机会了,到哪个公司搞一套来。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-14 01:17
zorro2zzz
Rank: 1
等 级:新手上路
威 望:1
帖 子:96
专家分:0
注 册:2005-9-11
收藏
得分:0 
盗版的不行么?

编程是啥东西,让俺瞧瞧……
2005-09-14 08:58
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
盗版的我这里也没有。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-14 17:58
快速回复:重载输入输出运算符的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060172 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved