免费注册 查看新帖 |

Chinaunix

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

[C++] 请教一个关于 += 重载的问题, 谢谢哪位高手指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-22 20:20 |只看该作者 |倒序浏览
弄了半天没弄出来: 希望哪位好心的高手帮忙:

//播放列表:增加一首歌曲 +=的重载
#include<iostream>
using namespace std;
//#include<string>

class Playlist{
      int n;
      char** names;
   public:
      Playlist(int m, char* p[]){
        n = m;
        names = new char*[n];
        for(int i = 0; i < n; ++i)
             names = new char[20];
        for(int i = 0; i < n; ++i)
           *names = *p;
      }
      ~Playlist()
       {
          for(int i = 0; i < n; ++i)
             { delete names; names = NULL;}
          delete[] names; names = NULL;
       }
       friend ostream& operator<<(ostream& o, const Playlist& s)
       {
          o << s.n << ' ';
          for(int i = 0; i < s.n; ++i)
             o << s.names;
          return o;
       }
       friend Playlist& operator+=(Playlist& s, char* song)
       {
         s.n += 1;//曲目数+1
         char** names = new char*[s.n];//申请临时空间
        for(int i = 0; i < s.n; ++i)
             names = new char[20];
        for(int i = 0; i < s.n - 1; ++i)//把老数据存入临时空间
            *names = *s.names;
        *names[s.n-1] = *song;//把新增曲目存入临时空间的最后
        for(int i = 0; i < s.n; ++i)
             { delete s.names; s.names = NULL;}
        delete[] s.names; s.names = NULL;//删除老空间
        s.names = new char*[s.n];//申请一个长度+1的空间给对象s
        for(int i = 0; i < s.n; ++i)
             s.names = new char[20];
        for(int i = 0; i < s.n; ++i)
            *s.names = *names;
        //将临时空间里的数据导入s的新空间里
        for(int i = 0; i < s.n; ++i)
             { delete names; names = NULL;}
        delete[] names; names = NULL;//删除临时空间
        return s;
       }
};
int main()
{
   Playlist s1(2,{"yu","fang"});
   cout << s1 << endl;
   s1 += "mjb";
   cout << s1 << endl;
}
错误提示看不懂)
playlist.cc: In function `int main()':
playlist.cc:57: parse error before `{' token
playlist.cc:58: warning: the address of `Playlist s1(...)', will always
be
   `true'
playlist.cc:59: invalid operands of types `Playlist ()(...)' and `const
char[4]
   ' to binary `operator+'
playlist.cc:59:   in evaluation of `operator+=(class Playlist ()(...), const
   char[4])'
playlist.cc:60: warning: the address of `Playlist s1(...)', will always
be
   `true'

论坛徽章:
0
2 [报告]
发表于 2008-04-22 20:28 |只看该作者

回复 #1 jiaozi4110 的帖子

今天实在太晚了, 作业完不成了, 要赶不上车了, 先回家了,如果哪位高手帮忙的话,留点信息, 明天请教, 谢谢,鞠躬!!!!

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
3 [报告]
发表于 2008-04-22 20:42 |只看该作者
完了, 谁也不敢告诉你了, 受不起鞠躬啊.

论坛徽章:
0
4 [报告]
发表于 2008-04-23 09:29 |只看该作者

回复 #3 醉卧水云间 的帖子

大侠,帮帮忙吧,真的很痛苦~~~~~~~~`

论坛徽章:
0
5 [报告]
发表于 2008-04-23 10:07 |只看该作者
与赋值操作符一样,复合赋值操作通常应定义为类的成员函数,注意第一个形参是this指针。
还有友元函数最好不要(不能?)在类的内部定义。

论坛徽章:
0
6 [报告]
发表于 2008-05-02 03:27 |只看该作者

回复 #1 jiaozi4110 的帖子

都用标准库实现吧,那样将省去你许多麻烦,还有现在程序里潜藏的错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP