免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2967 | 回复: 15
打印 上一主题 下一主题

操作符重载问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-08 19:45 |只看该作者 |倒序浏览
本帖最后由 getmonyinfo 于 2012-03-08 20:35 编辑

  1. ssize_t write(int fd, const void *buf, size_t count);
复制代码
函数写了一个buffer类,
代码如下:

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. using namespace std;

  7. class Buffer
  8. {
  9.         public:
  10.                 Buffer ();
  11.                 Buffer (size_t size);
  12.                 ~Buffer () { if (Data != NULL) free( Data); }
  13.                
  14.                 size_t Size () { return DataSize;}
  15.                 operator char *() const { return Data; }
  16.                 friend ostream &operator<< (ostream &os, Buffer &buf) { os << buf.Data; return os; }

  17.         private:
  18.                 char *Data;
  19.                 size_t DataSize;
  20. };

  21. Buffer::Buffer ()
  22.         :Data (NULL), DataSize (0)
  23. { }

  24. Buffer::Buffer (size_t size)
  25.         : Data (NULL), DataSize (size)
  26. {
  27.         Data = (char *) malloc (size);
  28. }

  29. int main ()
  30. {
  31.         int fd;
  32.         fd = open ("1.info", O_CREAT | O_WRONLY | O_TRUNC);
  33.         Buffer buf (100);

  34.         for (size_t i = 0; i < buf.Size (); ++i)
  35.                 buf[i] = (char )i;

  36.         for (size_t i = 0; i < buf.Size (); ++i)
  37.                 cout << buf[i] << endl;
  38.         //write (fd, buf, buf.Size ());
  39. }
复制代码
现在的问题是 cout << buf << endl;输出的全是乱码, 这程序哪里有问题呢?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2012-03-08 20:18 |只看该作者
回复 1# getmonyinfo


    我做纯C,不太懂。

   那个,重载<<的时候,
        friend ostream &operator<< (ostream &os, Buffer &buf) { cout << buf.Data; return os; }
           首先是应该用ostream<<buf.Data吧,另外,buf.Data是个指针,不是string类的对象,会不会是c字符串的问题?这个我不清楚哈;

    析构函数里应该对Data!=NULL再free。

论坛徽章:
0
3 [报告]
发表于 2012-03-08 20:36 |只看该作者
回复 2# cokeboL


你说的两个地方已更正, 不过这句 "另外,buf.Data是个指针,不是string类的对象,会不会是c字符串的问题?" 能在详细一点吗?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
4 [报告]
发表于 2012-03-08 20:44 |只看该作者
本帖最后由 cokeboL 于 2012-03-08 20:46 编辑

回复 3# getmonyinfo


    c字符串在c++里,这个我不太懂啊,是不是要有什么cstring之类的还是怎么的,我最近刚开始看一点c++,等等我去试试啊

   另外free后最好再把Data=NULL一下,虽然基本没影响,但看上去舒服

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
5 [报告]
发表于 2012-03-08 21:00 |只看该作者
回复 3# getmonyinfo


    才看你main里的函数。。你赋值的时候就赋的这些啊,首先不应该用buf=,buf是类,要用也该是buf.Data=,类的这种赋值是怎么赋的我不太清楚,但我觉得应该是把一

个char给了5个字节大小的类内存赋值了吧,这个可以打印下buf的地址看下相邻两个之间地址的差值是几个字节,然后再看cout吧

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2012-03-08 21:09 |只看该作者
回复 1# getmonyinfo

0与'0'的问题……

  1. for (char c=0;c<=9;++c)
  2.       cout<<c<<endl; // 或者printf("%c\n",c);
复制代码
对比

  1. for (char c='0';c<='9';++c)
  2.       cout<<c<<endl; // printf("%c\n",c);
复制代码
0-100中本来就有很多"乱码"。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
7 [报告]
发表于 2012-03-08 21:11 |只看该作者
厄,我看懂一点了,你还有char *的重载,那就正常了,0到100前面的ascll码,好像就这样子吧。。

论坛徽章:
0
8 [报告]
发表于 2012-03-08 21:41 |只看该作者
回复 6# OwnWaterloo


确实是这样 , 能在解释一下为什么这样吗?

   

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2012-03-08 22:02 |只看该作者
本帖最后由 OwnWaterloo 于 2012-03-08 22:03 编辑

回复 8# getmonyinfo

擦…… 这…… 你让我怎么解释……

假设执行环境使用ascii……

printf("%c",48); // 或者 printf("%c",'0');
cout<<(char)48; // cout<<'0';

才会显示出'0'这个字符。

或者这么说……
if ('0'==48) printf("yes"); else printf("no"); 会输出yes
if ('0'==0) printf("yes"); else printf("no"); 会输出no

实在不知道怎么说好了……

总之,你要向终端缓冲区或者文件的某个字节里写入48这个值,才会显示成'0'这个字符。
直接写入0这个值,显示的方法就很奇葩了……  有一种显示方式是^@

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2012-03-08 22:08 |只看该作者
如果楼主是自己写成这样的:
getmonyinfo 发表于 2012-03-08 19:45
if (Data != NULL) free( Data);


也就算了……


但貌似是被你教坏的……
cokeboL 发表于 2012-03-08 20:18
析构函数里应该对Data!=NULL再free。


free(NULL) 是绝对安全的,知道吗……
if (p) free(p); 完全是废话。


cokeboL 发表于 2012-03-08 20:44
另外free后最好再把Data=NULL一下,虽然基本没影响,但看上去舒服

同样,不要教坏小孩纸好吗……  我看着就一点都不舒服……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP