рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдиреЛрдЯ рд╣реИ рдХрд┐
рдирдП рд╕реА ++ 11 рдорд╛рдирдХ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдХреИрд╕реЗ рдмрджрд▓ рдЧрдИ рд╣реИрдВред C ++ 98 рдореЗрдВ, рдПрдХ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ "рдЙрдЪрд┐рдд" рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкрд╛рд╕ред рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рдирдХрд▓ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдХрдо рд╕реЗ рдХрдо рд╕рдВрд╕рд╛рдзрди рдХреА "рдЧрд╣рд░реА" рдирдХрд▓ рдХреЗ рдмрд┐рдирд╛)ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП CILE 98 рдореЗрдВ рд▓рд┐рдЦреЗ
FILE*
рдЖрд╕-рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рджреЗрдЦреЗрдВ:
class File { FILE* handle; public: File(const char* filename) { if ( !(handle = fopen(filename, "r")) ) throw std::runtime_error("blah blah blah"); } ~File() { if (handle) fclose(handle); }
рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐
FILE*
рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ
FILE*
рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕рдХрд╛ рдмрд╣реБрдд рднреМрддрд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдк
File
рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛
File
? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо
File
рдХреЛ рдПрдХ рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдРрд╕рд╛ рдХреЛрдб рдмрд╕ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
std::vector<File> files; files.push_back(File("data.txt"));
C ++ 98 рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди
shared_ptr
рдХрд╛
shared_ptr
:
std::vector<boost::shared_ptr<File> > files; files.push_back(boost::shared_ptr<File>(new File("data.txt")) );
рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдВрдЦ рдХреЛ рднрд╛рддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рд╣рдо C ++ 11 рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рддрд╕реНрд╡реАрд░ рдмрд╣реБрдд рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдЬрдм рддрдХ рдЖрдк рдкреВрд░реЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ, рддрдм рддрдХ
рд╕реНрдЯреЗрдВрдб рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо C ++ 11 рдореЗрдВ
File
рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
class File { FILE* handle; public: File(const char* filename) { if ( !(handle = fopen(filename, "r")) ) throw std::runtime_error("blah blah blah"); } ~File() { if (handle) fclose(handle); } File(File&& that) { handle = that.handle; that.handle = nullptr; } File& operator=(File&& that) { std::swap(handle, that.handle); return *this; } File(const File&) = delete;
рдлрд┐рд░ рд╕реЗ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЧрддрд┐ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЕрдм рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
std::vector<File> files; files.push_back(File("data1.txt")); files.push_back(File("data2.txt")); files.erase(files.begin());
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ рдирдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди
emplace_back
рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЙрдкреА рдХрд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
std::vector<File> files; files.emplace_back("data1.txt");
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреЛрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪрд▓рддреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдПрдХ рдирдП рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдореЗрдВ рд╕рднреА рд╕рдлрд▓рддрд╛!