13.4절 연습

3695 단어 C++primer
연습 13.33 왜 메시지의 멤버 save와remove의 매개 변수는Folder &입니까?왜 우리는 파라미터를 Folder 또는 const Folder & 로 정의하지 않습니까?
Folder에서 메시지를 추가/제거하는 것이 목적입니다.
Floder 추가/삭제를 정의하는 것은 메시지 복사본입니다. 대상 자체가 아니라 const Folder & 는 대상을 삭제할 수 없습니다.
연습 13.34 단원에서 설명한 메시지 작성
(13.37 참조)
연습 13.35 message가 작성된 복제 제어 멤버를 사용한다면 어떻게 됩니까?
합성된 복사 구조 함수를 사용하면 우리가 메시지를 복사할 때 얻은 복사본은 메시지와 같은 Floder에 나타날 것이다.
원래 Folder에 복사된 객체를 삽입하기 위해 자체 버전의 복사 구조 함수를 정의합니다.
13.36 설계를 연습하고 해당 Folder 클래스를 구현합니다.Folder에 포함된 메시지를 가리키는 set을 저장해야 합니다.
(13.37 참조)
연습 13.37은 Message 클래스에 구성원을 추가하여 folders에 주어진 Folder*를 추가하거나 삭제하는 것을 실현합니다.이 두 멤버는 Folder 종류의ddMsg와remMsg 체조와 유사하다.
//= .=
#include 
#include 
using namespace std;

class Folder;
class Message {
	friend class Folder;
	friend void swap(Message &, Message &);
public:
	explicit Message(const std::string &str = "") :contents(s) {}
	Message (const Message&);
	Message operator=(const Message&);
	~Message();
	void save(Folder&);
	void remove(Folder&);
private:
	std::string contents;
	std::set folders;
	void add_to_Folder(const Message&);
	void remove_from_Folder();
};

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

void Message::add_to_Folder(const Message &m)
{
	for (auto f : m.folders) {
		f->addMsg(this);
	}
}
Message::Message(const Message&m) :contents(m.contents), folders(m.folders)
{
	add_to_Folder(m);
}

void Message::remove_from_Folder()
{
	for (auto f : folders) {
		f->remMsg(this);
	}
}
Message::~Message()
{
	remove_from_Folder();
}

Message& Message::operator=(const Message &rhs)
{
	remove_from_Folder();
	contents = rhs.contents;
	folders = rhs.folders;
	add_to_Folder(rhs);
	return *this;
}

void swap(Message &lhs, Message &rhs)
{
	for (auto f : lhs.folders) {
		f->remMsg(&lhs);
	}
	for (auto f : rhs.folders) {
		f->remMsg(&rhs);
	}
	swap(lhs.folders, rhs.folders);
	swap(lhs.contents, rhs.contents);
	for (auto f : lhs.folders) {
		f->addMsg(&lhs);
	}
	for (auto f : rhs.folders) {
		f->addMsg(&rhs);
	}
}

class Folder {
	friend void swap(Message&, Message&);
	friend class Message;
public:
	~Folder(); // remove self from Messages in msgs  
	Folder(const Folder&); // add new folder to each Message in msgs  
	Folder& operator=(const Folder&); // delete Folder from lhs messages  
									  // add Folder to rhs messages  
	Folder(Folder&&);   // move Messages to this Folder   
	Folder& operator=(Folder&&); // delete Folder from lhs messages  
								 // add Folder to rhs messages  

#ifdef DEFAULT_FCNS  
	Folder() = default; // defaults ok  
#else  
	Folder() { } // msgs will be default initialized, which is what we want  
#endif  

	void save(Message&);   // add this message to folder  
	void remove(Message&); // remove this message from this folder  

	void debug_print(); // print contents and it's list of Folders,   
private:
	std::set msgs;  // messages in this folder  

	void add_to_Messages(const Folder&);// add this Folder to each Message  
	void remove_from_Msgs();     // remove this Folder from each Message  
	void addMsg(Message *m) { msgs.insert(m); }
	void remMsg(Message *m) { msgs.erase(m); }
	void move_Messages(Folder*); // move Message pointers to point to this Folder  
};

연습 13.38에서는 Message에 대한 대입 연산자를 설계하기 위해 복사 및 스왑을 사용하지 않습니다.당신은 원인이 무엇이라고 생각합니까?
복제 작업은 메모리를 분배하여 프로그램의 안전성을 높여야 한다.교환 작업은 이미 존재하는 두 자원을 교환하고 우선적으로 고려한다.

좋은 웹페이지 즐겨찾기