两个类互相作为类型使用的有关问题
两个类互相作为类型使用的问题
以下是C++ PRIMER中文第四版13章里消息处理机制中的课后习题,我自己扩充了下,出现了一些问题,主要是在类Message中使用了类Folder,编译器把类型当作Message::Folder来处理了,由此造成很多编译错误。我的文件代码如下:
定义类的头文件Message.h
编写定义类的函数等具体文件Message.cpp
编写类Folder函数代码的文件Folder.cpp
以下是C++ PRIMER中文第四版13章里消息处理机制中的课后习题,我自己扩充了下,出现了一些问题,主要是在类Message中使用了类Folder,编译器把类型当作Message::Folder来处理了,由此造成很多编译错误。我的文件代码如下:
定义类的头文件Message.h
#include <string>
#include <set>
#ifndef MESSAGEH
#define MESSAGEH
class Message
{
public:
class Folder;
Message(const std::string &str = ""):
contents (str) {}
Message(const Message&);
Message& operator=(const Message&);
~Message();
void save(Folder&);
void remove(Folder&);
std::string Show()
{ return contents; }
private:
std::string contents;
std::set<Folder*> folders;
void put_Msg_in_Folders(const std::set<Folder*>&);
void remove_Msg_from_Folders();
};
class Folder
{
public:
void remMsg(Message*);
void addMsg(Message*);
unsigned MsgNum();
std::string ShowMsg(unsigned);
private:
std::set<Message*> messages;
};
#endif
编写定义类的函数等具体文件Message.cpp
#include "Message.h"
#include <string>
#include <set>
Message::Message(const Message &ms):
contents(ms.contents), folders(ms.folders)
{ put_Msg_in_Folders(folders); }
Message& Message::operator=(const Message &ms)
{
if (&ms != this)
{
remove_Msg_from_Folders();
contents = ms.contents;
folders = ms.folders;
put_Msg_in_Folders(ms.folders);
}
return *this;
}
void Message::put_Msg_in_Folders(std::set<Folder*> &sf)
{
for (std::set<Folder*>::iterator beg = sf.begin();
beg != sf.end(); ++beg)
(*beg)->addMsg(this);
}
void Message::remove_Msg_from_Folders()
{
for (std::set<Folder*>::iterator beg = folders.begin();
beg != folders.end(); ++beg)
(*beg)->remMsg(this);
}
void Message::save(Folder &fds)
{
//如果该邮件的文件夹列表中没有这个文件夹,则将该文件夹添加到邮件的文件夹集合
if (!folders.count(&fds))
folders.insert(&fds);
//如果形参文件夹尚未保存该邮件指针,则予以保存
if (!(fds->messages).count(this))
(fds->messages).insert(this);
return;
}
void Message::remove(Folder &fds)
{
if (folders.count(&fds))
folders.erase(&fds);
if ((fds->messages).count(this))
(fds->messages).erase(this);
return;
}
Message::~Message()
{ remove_Msg_from_Folders(); }
编写类Folder函数代码的文件Folder.cpp
#include "Message.h"
#include <set>
#include <string>
#include <iostream>
void Folder::remMsg(Message *mp)
{
if (messages.count(mp))
messages.erase(mp);
return;
}
void Folder::addMsg(Message *mp)
{
if (!messages.count(mp))
messages.insert(mp);
return;
}
unsigned Folder::MsgNum()
{