Реализуйте String из параграфа 11.12 так, чтобы он стал столь же безопасным, как стандартный контейнер.
Не хочу я его реализовывать потому что он очень громадный класс, ну там только нужно добавить try блок в конструктор копирования или в какие нить функции которые выделяют память что бы перехватывать исключения. Мне не охота с ним парится поэтому мы просто щас создадим простую версию класса String и попытаемся ее как небудь обезопасить.
От что то вроде этого должно быть:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <iostream> using std::cout; using std::endl; #include <cstring> using std::strlen; using std::strcpy; class ex{}; class String { char* str; int size_t; public: String():str(0),size_t(0){} String(char* s) { try { size_t=strlen(s); str=new char[size_t+1]; strcpy(str,s); } catch(ex&) { delete str; } } String(const String& s) { try { str=new char[s.size_t+1]; throw ex(); strcpy(str,s.str); } catch(...) { delete str; cout <<"endl"<<endl; throw ex(); } } ~String(){cout <<"destr"<<endl;delete str;} int size(){return size_t;} void print(){cout <<str<<endl;} }; int main() { try { String s("hellow world"); cout <<"s.size()= "<<s.size()<<endl; s.print(); String s2(s); } catch(ex&) { cout <<"ex except"<<endl; } return 0; } |
[youtube]https://www.youtube.com/watch?v=UGMwo7VVrnw[/youtube]