清华大学出版社 C++教材,居然这样!

时间:2021-10-11 16:17:38
这是摘自钱能所著的《C++程序设计教程》(第二版)(清华大学出版社)第267页的一个程序。
原原本本抄下来的,在VC编译器上编译不能通过,明明是友元函数,却说不能访问私有数据成员;
还有int型的main函数没有返回值,书上竟有运行结果截图!而且,在书的编排特点说明中有“每个
有编号的程序代码都经作者亲手在Borland C++ 6.0的环境上调试完成,都是完整的可运行程序......”
自习想想,就算是盗版书籍,也不可能唯独掉了return 这一行代码吧?而且那个友元函数不能访问
私有数据成员的问题,也不可能是盗版的问题吧?
程序代码如下:
#include<iostream>
#include<iomanip>
using namespace std;

class Time
{
int hour,minute,second;
public:
void set(int h,int m,int s)
{
hour=h; minute=m; second=s;
}
friend Time& operator++(Time& a);
friend Time operator++(Time& a,int);
friend ostream& operator<<(ostream& o,const Time&t);
};//-------------------------------------
Time& operator++(Time& a)
{
if(!(a.second=(a.second+1)%60)&&!(a.minute=(a.minute+1)%60))
a.hour=(a.hour+1)%24;
return a;
}
Time operator++(Time& a,int)
{
Time t(a);
if(!(a.second=(a.second+1)%60)&&!(a.minute=(a.minute+1)%60))
a.hour=(a.hour+1)%24;
return t;
}
ostream& operator<<(ostream& o,const Time& t)
{
o<<setfill('0')<<setw(2)<<t.hour<<":"<<setw(2)<<t.minute<<":";
return o<<setw(2)<<t.second<<"\n"<<setfill(' ');
}
int main()
{
Time t;
t.set(11,59,58);
cout<<t++;
cout<<++t;
}
编译结果如下:
--------------------Configuration: Time - Win32 Debug--------------------
Compiling...
TimeOnIncrementOperators.cpp
E:\C++\Time\TimeOnIncrementOperators.cpp(33) : error C2248: 'hour' : cannot access private member declared in class 'Time'
        E:\C++\Time\TimeOnIncrementOperators.cpp(8) : see declaration of 'hour'
E:\C++\Time\TimeOnIncrementOperators.cpp(33) : error C2248: 'minute' : cannot access private member declared in class 'Time'
        E:\C++\Time\TimeOnIncrementOperators.cpp(8) : see declaration of 'minute'
E:\C++\Time\TimeOnIncrementOperators.cpp(34) : error C2248: 'second' : cannot access private member declared in class 'Time'
        E:\C++\Time\TimeOnIncrementOperators.cpp(8) : see declaration of 'second'
E:\C++\Time\TimeOnIncrementOperators.cpp(40) : error C2593: 'operator <<' is ambiguous
E:\C++\Time\TimeOnIncrementOperators.cpp(41) : error C2593: 'operator <<' is ambiguous
E:\C++\Time\TimeOnIncrementOperators.cpp(42) : warning C4508: 'main' : function should return a value; 'void' return type assumed
执行 cl.exe 时出错.

TimeOnIncrementOperators.obj - 1 error(s), 0 warning(s)

5 个解决方案

#1


清华大学出版社 C++教材,居然这样!

#2


友情帮顶!!!

#3


VC6对C++支持有问题。
书上说bCB能过,你可以用bcb
另外c++你G++下

#4


对了,VC2005以上的C++标准支持的好点。什么模板偏特化什么的都能用。

#5


程序中是存在错误,比如说main函数没返回值,忽略掉这个问题后,就是VC6.0不支持友元函数访问私有数据成员了。我刚用Visual Studio 9.0运行出来了。

#1


清华大学出版社 C++教材,居然这样!

#2


友情帮顶!!!

#3


VC6对C++支持有问题。
书上说bCB能过,你可以用bcb
另外c++你G++下

#4


对了,VC2005以上的C++标准支持的好点。什么模板偏特化什么的都能用。

#5


程序中是存在错误,比如说main函数没返回值,忽略掉这个问题后,就是VC6.0不支持友元函数访问私有数据成员了。我刚用Visual Studio 9.0运行出来了。