C++ Primer(第5版) 练习 13.36
练习 13.36 设计并实现对应的Folder类。此类应该保存一个指向Folder中包含的Message的set。
环境:Linux Ubuntu(云服务器)
工具:vim
代码块
# include <iostream>
using namespace std; class Folder ; class Messsage { friend class Folder ; friend void swap ( Message & lhs, Message & rhs) ; public : explicit Message ( const string & str = "" ) : contents ( str) { } Message ( const Message & ) ; Message & operator = ( const Message & ) ; ~ Message ( ) ; void save ( Folder & ) ; void remove ( Folder & ) ; private : string contents; set< Folder* > folders; void addFolder ( Folder * ) ; void remFolder ( Folder * ) ; void add_to_Folders ( const Message & ) ; void remove_from_Folders ( ) ;
} ; Message :: Message ( const Message & m) : contents ( m. contents) , folders ( m. folders) { add_to_Folders ( m) ;
} Message & Message:: operator = ( const Message & rhs) { remove_from_Folders ( ) ; contents = rhs. contents; folders = rhs. folders; add_to_Folders ( rhs) ; return * this ;
} Message :: ~ Message ( ) { remove_from_Folders ( ) ;
} void Message :: save ( Folder & f) { folders. insert ( & f) ; f. addMsg ( this ) ;
} void Message :: remove ( Folder & f) { folders. erase ( & f) ; f. remMsg ( this ) ;
} void Message :: addFolder ( Folder * f) { folders. insert ( f) ;
} void Message :: remFolder ( Folder * f) { folders. erase ( f) ;
} 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 swap ( Messsage & lhs, Messsage & rhs) { using std:: swap; 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 class Message ; friend void swap ( Message & , Message & ) ; public : Folder ( ) = default ; Folder ( const Folder & ) ; Folder & operator = ( const Folder & ) ; ~ Folder ( ) ; private : set< Message* > msgs; void addMsg ( Message * ) ; void remMsg ( Message * ) ; void add_to_Messages ( const Folder & ) ; void remove_to_Messages ( ) ;
} ; Folder :: Folder ( const Folder & f) { add_to_Messages ( f) ;
} Folder& Folder:: operator = ( const Folder & f) { remove_to_Messages ( ) ; msgs = f. msgs; add_to_Messages ( f) ; return * this ;
} Folder :: ~ Folder ( ) { remove_to_Messages ( ) ;
} void Folder :: addMsg ( Message * m) { msgs. insert ( m) ;
} void Folder :: remMsg ( Message * m) { msgs. erase ( m) ;
} void Folder :: add_to_Messages ( const Folder & f) { for ( auto m : f. msgs) { m-> addFolder ( this ) ; }
} void Folder :: remove_from_Message ( ) { for ( auto m : msgs) { m-> remFolder ( this ) ; }
}