c++primer13.4消息和文件夹

#include <iostream>
#include <vector>
#include <string>
#include <set> 
using namespace std;
class Message;
class Folder
{
    friend class Message;
    private:
        set<Message*> msgs;//该文件夹中所含的信息
    public:
    //构造函数 
        Folder():msgs(set<Message*>()){} 
        Folder( Message &);
        //向该文件夹添加、删除信息 
        void addMsg(Message *m);
        void remMsg(Message *m);
        Folder(const Folder&);//
        ~Folder();
        Folder& operator=(const Folder &rhs); 
        void print_f_size()
        {
            cout<<"该文件夹中包含的消息个数为: "<<msgs.size()<<endl;
        }
        
         
};
class Message
{    friend class Folder;//声明文件夹类为友元类,可以访问Message中的内容 
    private:
        string contents;
        set<Folder*> folders;//包含该消息的所有文件夹
    public:
        //构造函数 
        Message(const string &m):contents(m),folders(set<Folder*>()){}//未指定文件夹 
        Message(const string &m,Folder &f);//指定文件夹
        //功能函数 
        void save(Folder *);
        void remove(Folder *);
        //拷贝构造函数
        Message(const Message&);
        Message& operator=(const Message &rhs); 
        void print_m_size()
        {
            cout<<"存有该消息的文件夹个数为: "<<folders.size()<<endl;
        }

            
};

Message::Message(const string &m,Folder &f):contents(m){
        folders.insert(&f);
        f.msgs.insert(this);
        }
Folder::Folder( Message &m)
{
    msgs.insert(&m);
    m.folders.insert(this);
}
Message::Message(const Message &m)
{
    contents=m.contents;//消息内容的拷贝 
    folders=m.folders;//存有该消息的文档的拷贝
    for(auto f:folders)//Folder*
    {
        f->msgs.insert(this);//更新保存了该消息的文件夹 
    }
     
}
Message& Message::operator=(const Message &rhs)
{
    contents=rhs.contents;
    folders=rhs.folders;
    for(auto f:folders)
    {
        f->msgs.insert(this);//更新保存了该消息的文件夹 
    }
    return *this; 
}
void Message::save(Folder *f)
{
    folders.insert(f);
    f->msgs.insert(this);
}
void Message::remove(Folder *f)
{
    folders.erase(f);
    f->msgs.erase(this);
}
void Folder::addMsg(Message* m)
{
    msgs.insert(m);//消息插入msgs set 
    //m->folders.insert(this);//更新包含该消息的set 
}
void Folder::remMsg(Message *m)
{
    msgs.erase(m);
    //m->folders.erase(this);    
}
Folder::Folder(const Folder& f)
{
    msgs=f.msgs;
    //更新f文件夹中所有消息的文件夹信息
    for(auto m:f.msgs)
    {
        m->folders.insert(this);//每条消息添加新的文件夹    
    } 
}
Folder::~Folder()
{
    for(auto m:msgs)//遍历本文件夹中的消息set 
    {
        m->folders.erase(this); //修改消息对象中的文件夹成员 
    }
}
Folder& Folder::operator=(const Folder &rhs)
{
    //该文件中本来的消息所对应的消息的文件夹修改
    for(auto m:msgs)
    {
        m->folders.erase(this);
    } 
    msgs=rhs.msgs;
    //给rhs文件夹中的消息添加新的文件夹信息
    for(auto m:rhs.msgs)
    {
        m->folders.insert(this);//this是Folder 
    } 
    return *this; 
}
int main(int argc, char *argv[])
{
    Folder f1,f2;
    
    Message m1("heloo asd");
    Message m2("this is f2",f2);
    Message m3("o;k;m");
    m2.print_m_size();//1
    f2.print_f_size();//1 ?? 
    f1.print_f_size(); 
    m3.save(&f2);
    f2.print_f_size();//2
    return 0;
}

 

posted @ 2022-03-23 22:16  菠萝超级酸  阅读(39)  评论(0编辑  收藏  举报