主题:[讨论]VS中的<<重载
雪光风剑
[专家分:27190] 发布于 2010-06-16 22:27:00
写了段程序,里面要重载<<操作符用来输出信息
相关代码如下:
std::ostream& operator<< (std::ostream &output, const Room &thisRoom )
{
output<<"You are in "<<thisRoom.description<<"\nYou can move to:";
if(thisRoom.Neighbor[(int)east]!=NULL)
output<<"e\t";
if(thisRoom.Neighbor[(int)west]!=NULL)
output<<"w\t";
if(thisRoom.Neighbor[(int)south]!=NULL)
output<<"s\t";
if(thisRoom.Neighbor[(int)north]!=NULL)
output<<"n\t";
output<<"\nEnter the direction:Q for quit";
return output;
}
编译中始终出现一个警告:c:\documents and settings\kant\my documents\visual studio 2008\projects\maze\maze\room.h(96) : warning C4717: “operator<<”: 如递归所有控件路径,函数将导致运行时堆栈溢出
这个96行就是最后的右大括号的地方。
编译后运行时无限重复"You are in "直至程序崩溃
但是同样的代码用gcc编一下(dev c++)就没问题,能正确运行
请教大家这是什么问题呢?
回复列表 (共9个回复)
沙发
bruceteen [专家分:42660] 发布于 2010-06-17 00:36:00
呵呵,我这里没有vs,你试试如下代码,看看是不是也会警告
void foo( int )
{
}
void foo( float )
{
foo( 0 );
}
如果是那就太傻了
板凳
雪光风剑 [专家分:27190] 发布于 2010-06-17 07:49:00
上述用例编译是没错的,纠结啊
3 楼
eastcowboy [专家分:25370] 发布于 2010-06-19 05:33:00
thisRoom.description
这个成员的类型该不会是Room吧?-_- 如果是的话,出现死递归就是合理的了。
用您的代码,添加一些变成完整程序,编译运行,没有死递归,没有崩溃。
[code=c]#include <iostream>
#include <string>
enum {
east,
west,
south,
north,
};
class Room {
public:
std::string description;
Room* Neighbor[4];
Room()
{
Neighbor[0] = Neighbor[1] = Neighbor[2] = Neighbor[3] = NULL;
}
};
std::ostream& operator<< (std::ostream &output, const Room &thisRoom )
{
output<<"You are in "<<thisRoom.description<<"\nYou can move to:";
if(thisRoom.Neighbor[(int)east]!=NULL)
output<<"e\t";
if(thisRoom.Neighbor[(int)west]!=NULL)
output<<"w\t";
if(thisRoom.Neighbor[(int)south]!=NULL)
output<<"s\t";
if(thisRoom.Neighbor[(int)north]!=NULL)
output<<"n\t";
output<<"\nEnter the direction:Q for quit";
return output;
}
int main() {
Room r;
std::cout << r;
return 0;
}[/code]
程序输出:
You are in
You can move to:
Enter the direction:Q for quit请按任意键继续. . .
编译工具:
Visual C++ Express 2008 SP1
4 楼
雪光风剑 [专家分:27190] 发布于 2010-06-19 09:37:00
description肯定是string的没问题。奇怪就奇怪在用VS2008就会挂掉,用dev c++编就啥事都没有- -
5 楼
peige [专家分:550] 发布于 2010-06-23 20:33:00
看看类中有没有存在隐式转换代码,或者直接禁了隐式,看看还会不会发生此情况,
这些特定编译器中的BUG知道个大概就可以,没必要这么在意,
就像我以前遇到的VC6的BUG这样,是很郁闷,不过我们还是得依赖编译器,我们只能适应它。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
class a
{
public:
a():width(0),height(0){}
~a(){}
void create(int width,int height,int imx);
int width;
int height;
int mx;
};
void a::create(int width,int height,int imx)
{
width=width;
height=height;
mx=imx;
}
class b
{
public:
b():l(0){}
~b(){}
void release(){ if(l!=0) delete l;}
void create(int width,int height,int imx);
private:
a *l;
};
void b::create(int width,int height,int imx)
{
l=new a;
l->create(width,height,imx);
cout<<"l->width="<<l->width<<endl;
cout<<"l->height="<<l->height<<endl;
cout<<"l->mx="<<l->mx<<endl;
}
int main()
{
b d;
d.create(100,200,300);
return 0;
}
运行结果领人结舌:
l->width=0
l->height=0
l->mx=300
Press any key to continue
6 楼
bruceteen [专家分:42660] 发布于 2010-06-23 21:37:00
re peige:
width=width;
height=height;
这个不能算是VC的bug吧,应该写成
this->width=width;
this->height=height;
7 楼
雪光风剑 [专家分:27190] 发布于 2010-06-23 23:38:00
顶bt哥,不然方法怎么知道哪个width是属性,哪个是外部变量?指代不明了
8 楼
peige [专家分:550] 发布于 2010-06-24 08:31:00
我承认是本人的习惯不好;
但又有多少人会在设计类中,每个成员都套一个this->下去呢,偶尔没有加上this是很正常的事,我只是想说明VC6存在这种缺陷,而我称之为BUG
PS:我好像以前也把这段代码放别的编译器(如DEV CPP),次编译器好像就能侦测出来,
9 楼
雪光风剑 [专家分:27190] 发布于 2010-06-24 22:59:00
同名对象的作用域解析貌似结果是由编译器决定的吧。不写明无疑不是一个好习惯
我来回复