C++primer 학습: 복사 제어(5)
메일 처리에 사용할 수 있는 두 개의 클래스를 작성합니다. 각각 메시지와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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.