13.4절 연습
3695 단어 C++primer
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에 대한 대입 연산자를 설계하기 위해 복사 및 스왑을 사용하지 않습니다.당신은 원인이 무엇이라고 생각합니까?
복제 작업은 메모리를 분배하여 프로그램의 안전성을 높여야 한다.교환 작업은 이미 존재하는 두 자원을 교환하고 우선적으로 고려한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c++ primer 학습 노트 -----2.4const 한정자실제 이 내용을 사용할 때 유형과 유형이 합법적으로 일치할 수 있는지 반드시 주의해야 합니다} 상수 인용이 다른 기본 형식의 대상에 귀속되었을 때, 실제 편집기는 인용과 같은 종류의 임시 변수 (상수) 를 만들어서,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.