广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 4778 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
pkpk0808 手机
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x9
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[C/C++] 运算子重载[]时,如何得知等号右边的值呢??
先叙述一下问题背景
是这样子的:
我有一个属于class ABC的obj
class ABC中有类似String class的部分
所以我实作一个[]可以更改obj中的字串的某一个值
例如 obj = 'x'

而在我所定义的[]中
有一些动作是当 obj1 == 'x' 时不必执行的
(ex. obj的字串内容是Hello 那 ..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



献花 x0 回到顶端 [楼 主] From:台湾教育部 | Posted:2005-06-10 18:16 |
Freelife
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x2 鲜花 x60
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

obj[1]='e'

这样子应该是2个运算子的重载([]和=)~
obj[1]的时候是[]的运算~取到值之后再做=的运算~
这个时候,当然知道=右边是什么值啦~

看不太懂你要问什么,不知道这个回答你满不满意呢?


献花 x0 回到顶端 [1 楼] From:台湾中华电信 | Posted:2005-06-13 10:39 |
夷希微
个人头像
个人文章 个人相簿 个人日记 个人地图
社区建设奖
知名人士
级别: 知名人士 该用户目前不上站
推文 x13 鲜花 x1682
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

说真的~还真的是不太懂您在问什么呢 ^^" 表情 表情
可以麻烦请先将您的程式码贴出来好吗 ^^" 表情 表情


视之不见,名曰夷;
听之不闻,名曰希;
搏之不得,名曰微。
此三者不可致诘,故混而为一。

[截自老子道德经第十四章]
献花 x0 回到顶端 [2 楼] From:台湾中华电信 | Posted:2005-06-13 19:41 |
pkpk0808 手机
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x9
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

先回答一下一楼的网友,
其实他只做一次[]重载运算
=不需要重载



复制程式
char& RCString::operator[](int index)
{
       //cout<<strlen(value->data);
       //index: 0 ~ lenth
       if(index<0 || index>strlen(value->data))
              exit(1);
       
       if(value->refCount > 1)
       {
              value->refCount--;
              char* strTemp = new char [strlen(value->data)+1];
              strcpy(strTemp, value->data);
              value = new StringValue (strTemp);
              //if(strTemp!=NULL)
                     delete[] strTemp;
       }

       return value->data[index];
}

会用到[]重载有两种情形
1. cout<<obj[2];
2. obj[2] = 'x'

第一种情形我们只对obj[2]作读取动作
第二种情形我们对obj[2]作涂写动作

但是一般来说,我们并没有办法从[]重载中得知
这次的呼叫是要做读取还是做写入呢?

于是在Reference Count
我只好把他一律当写入动作

然后, 问题就发生了
我如果只有读取(cout<<obj[2];)
却会产生一整组新的 Reference
这是错误的。

问题就是这样, 应该够明白了吧

<(_ _)>谢谢各位


献花 x0 回到顶端 [3 楼] From:台湾教育部 | Posted:2005-06-14 00:03 |
Freelife
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x2 鲜花 x60
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

产生一组新的Reference??
这是指多占用一块记忆体吗?
小弟还是不太了解是什么意思 表情

另外,你是从何得知这个结果的呢?? 表情


献花 x0 回到顶端 [4 楼] From:台湾中华电信 | Posted:2005-06-14 10:45 |
pkpk0808 手机
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x9
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

我来说明一下Reference Count是做什么的好了

假如果我有n笔资料但这n笔资料的内容是一样的话
我会占用 mem * n的空间
这无形中是一种浪费

于是我用另外一个方法指标
将这n笔资料通通指向 同一个地方
并用一个变数refCount纪录着一共有几笔资料共用这个地方

如果有另外一笔资料要新增到此处的话
一样把指标指过来,并且将refCount+1

相反的,如果有资料要变更或是移除的时候
把指标取消,并且refCount-1

如果refCount=0的时候,就将该处的记忆体位址释放出来避免占用


我的程式是纪录字串
那一处的程式码是
复制程式
s3[1]='x'
因为s3变动到了,所以我必须将s3独立出来占用另外一块记忆体空间
所以原本的refCount-1,并且另外分配一个空间给s3

因为这些动作全部写在 = 的operator overloading function里头
所以,假如我只做了读取的动作,例如这样
复制程式
cout<<s3[1]
但是它仍然会去呼叫=的operator overloading
造成另外在开一个记忆体空间给s3使用
而且s3的refCount=1

错误就产生啦!!
因为其实s3跟之前的内容是一样的..但是他却占用了另外一组空间

至于哪里得知结果
将s3的refCount印出来就知道了
或是用debug看也有


献花 x1 回到顶端 [5 楼] From:台湾教育部 | Posted:2005-06-15 14:21 |
Freelife
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x2 鲜花 x60
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片


而在我所定义的[]中
有一些动作是当 obj1[1] == 'x' 时不必执行的
(ex. obj的字串内容是Hello 那当执行 obj[1]='e'的时候
是不必执行[]运算子重载定义里面的某些指令)

那问题是这样子的:
我如何在我的[]运算子重载定义中得知 等号右边值呢????


就我所知,要取得'='右边的值,就是要重载=运算子,才能取到这个值。


因为这些动作全部写在 = 的operator overloading function里头
所以,假如我只做了读取的动作,例如这样

cout<<s3[1];

但是它仍然会去呼叫=的operator overloading


这个就超出我所学的范围了,不知道大大是否愿意提供完整程式码出来测试呢?
我也想暸解,要如何达到这个功能 表情

codeboy我看到你有送花,那就是你也会啰 表情
教一下小弟咩 表情


献花 x0 回到顶端 [6 楼] From:台湾中华电信 | Posted:2005-06-15 17:27 |
pkpk0808 手机
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x9
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

呵呵, codeboy跟我说这篇文章很有价值,
等讨论结果出来再收精华区,
他也没说他会不会,会就不要深藏不露了嘛 表情

其实我后来是有找到方法,
跑到图书部翻了好久翻到的....

不过等我期末考完再po吧XD


献花 x0 回到顶端 [7 楼] From:台湾教育部 | Posted:2005-06-15 21:53 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.091686 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言