c++primer13章4节的一点疑问

小白最近啃c++primer遇到了一点问题,网上查了半天也没找到解答,希望能有大神解惑下。

在中文版的13.4节拷贝控制示例,462页中save和remove成员,save调用了addMsg函数,代码如下:

void Message::save(Folder& f)
{
 folders.insert(&f);
 f.addMsg(this);
}

save调用了函数而不是直接调用messages(Folder中的set<Message*>成员,用于记录Message列表)的insert添加元素,那么可知save不是Folder的友元而且addMsg应该是public的,但在后续编写Folder的过程中,addMsg的编写遇到了问题:

如果addMsg是public的,那么考虑到用户调用addMsg的可能性,addMsg就不能只给messages添加元素,还要更新对应Message中的folders,而addMsg又不能调用Message的save函数(这样会互相调用,死循环),那么要么addMsg声明为Message的友元(这样才能访问其私有成员更新folders),但这样的话上面代码中的“folders.insert(&f);”就多余了;要么再给Message添加一个给folders添加元素的函数,而且必须是public的,这样该函数又会陷入addMsg的困境,即要考虑到用户调用的可能性。

而如果addMsg是private的,用户就不能调用addMsg了,但这时候save就必须是Folder的友元,这样的话save可以直接调用messages的insert来更新,addMsg的存在意义是什么?

以上是我遇到的问题,希望能得到解答,感谢;

以及我的QQ632863627,欢迎交流^-^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值