小白最近啃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,欢迎交流^-^