C++primer 학습: 복사 제어(5)

8415 단어

메일 처리에 사용할 수 있는 두 개의 클래스를 작성합니다. 각각 메시지와Folder로 명명되며, 각각 메일 메시지와 메시지 디렉터리를 표시합니다.


[1] 각 메시지 객체는 여러 Folder 디렉토리에 나타날 수 있지만 임의로 지정된 메시지 컨텐트에는 복사본이 하나만 있습니다.메시지 내용이 바뀌면 디렉터리에서 메시지를 훑어볼 때 변경된 내용을 볼 수 있습니다.[2] 메시지 대상을 복사할 때 복사본과 원 대상은 서로 다른 메시지 대상이지만 같은 Folder에 나타나야 한다.[3] 메시지를 제거하면 다시 존재하지 않으며 이 메시지를 포함하는 모든 Folder에서 이 메시지 포인터를 삭제합니다.[4] 우리가 하나의 메시지를 다른 사람에게 부여할 때 왼쪽의 대상은 오른쪽으로 대체되고 해당하는 업데이트를 처리한다.자신이 할당한 값을 처리할 수 있는 상황을 주의해야 한다.[5] 해당하는 swap을 작성하면 메시지의 효율성이 향상됩니다.[6] Folder 클래스의 작업은 메시지와 유사합니다.

많은 작업이 중복되기 때문에private 부분에서 해당하는 구성원을 작성합니다.

#include "iostream"
#include "fstream"
#include "sstream"
#include "string"
#include "vector"
#include "algorithm"
#include "memory"
#include "map"
#include "set"
using namespace std;
class Folder;
class Message
{
    friend void swap(Message&, Message&);
    friend class Folder;
public:
    explicit Message(const string & s = string()) :contents(s){}// 
    // 
    Message(const Message &);// 
    Message& operator=(const Message&);
    ~Message(){ remove_from_Folders();}
    void save(Folder &);
    void remove(Folder&);


private:
    string contents;
    set<Folder*>Folders;
    void add_to_Folders(const Message&);// message Message Folders
    void remove_from_Folders();// Folders Folder Message
    void addFldr(Folder* f) { Folders.insert(f); }
    void remFldr(Folder* f) { Folders.erase(f); }
};
class Folder
{
    friend void swap(Folder&, Folder&);
    friend class Message;
public:
    Folder() = default;
    Folder(const Folder&);
    Folder& operator= (const Folder& );
    ~Folder();
    void addMsg(Message * m){ Messages.insert(m); }
    void remMsg(Message * m){ Messages.erase(m); }

private:
    set<Message*> Messages;
    void add_to_message(const Folder &);
    void remove_from_message();
};
///////////////////////////////////////////////////////////////Message 
void swap(Message& lhs, Message& rhs)
{
    using std::swap;
    lhs.remove_from_Folders();
    rhs.remove_from_Folders();
    swap(lhs.Folders, rhs.Folders);
    swap(lhs.contents, rhs.contents);
    lhs.add_to_Folders(lhs);
    rhs.add_to_Folders(rhs);
}
Message::Message(const Message & m)
{
    contents = m.contents;
    Folders = m.Folders;
    add_to_Folders(m);
}
Message& Message:: operator=(const Message& m)
{
    remove_from_Folders();// Folders
    contents = m.contents;
    Folders = m.Folders;
    add_to_Folders(m);
    return *this;
}
void Message::add_to_Folders(const Message& m)
{
    for (auto f : m.Folders)
        f->addMsg(this);
}
void Message::remove_from_Folders()
{
    for (auto f : Folders)
        f->remMsg(this);
}
void Message::save(Folder & f)
{
    Folders.insert(&f);
    f.addMsg(this);
}
void Message::remove(Folder & f)
{
    Folders.erase(&f);
    f.remMsg(this);
}
/////////////////////////////////////////////Folders 
void swap(Folder& lhs, Folder& rhs)
{
    using std::swap;
    lhs.remove_from_message();
    rhs.remove_from_message();
    swap(lhs.Messages, rhs.Messages);
    lhs.add_to_message(lhs);
    rhs.add_to_message(rhs);
}
Folder::Folder(const Folder& f)
{
    Messages = f.Messages;
    add_to_message(f);
}
Folder& Folder:: operator= (const Folder& f)
{
    remove_from_message();
    Messages = f.Messages;
    add_to_message(f);
    return *this;
}
Folder::~Folder()
{
    this->remove_from_message();
}
void Folder:: remove_from_message()
{
    for (auto m : Messages)
        m->addFldr(this);
}
void Folder:: add_to_message(const Folder & f)
{
    for (auto m : f.Messages)
        m->addFldr(this);
}
int main()
{
    Message a("aaaaaaaaaaaa");
    Message b("bbbbbbbbbbbbb");
    Folder f1;
    a.save(f1);
    b = a;
    return 0;
}

좋은 웹페이지 즐겨찾기