stringクラスの自作による自演
stringをincludeすればよいのにもかかわらず、
あえて作ってみたstringクラス。
かなり前に作ったのを今頃張ってみる。
class String { private: char * str_; public: // コンストラクタ String() { str_ = new char[]; } String(char * obj, int size = -1) { // ヌルの無い配列の場合はサイズを渡す str_ = new char[]; if (size < 0) strcpy(str_, obj); else { strncpy(str_, obj, size); str_[size] = '\0'; } } String (int obj, int radix = 10) { str_ = new char[]; itoa(obj, str_, radix); } // デストラクタ virtual ~String() { delete [] str_; } // 演算子(+) virtual String operator+(String obj) const { String tmp; tmp = *this; strcat(tmp.str_, obj.str_); return tmp; } virtual String operator+(char * obj) const { // ヌル付きじゃないと……まずい // 確実に付く保証が無かったらString(char *, int)にキャストすべき String tmp; tmp = *this; strcat(tmp.str_, obj); return tmp; } // 演算子(+=) virtual String & operator+=(String obj) { strcat(this->str_, obj.str_); return *this; } virtual String & operator+=(char * obj) { // ヌル付きじゃないと…… strcat(this->str_, obj); return *this; } // 演算子(=) virtual void operator=(String obj) const { strcpy(this->str_, obj.str_); } virtual void operator=(char * obj) const { // ヌル付きじゃないと…… strcpy(this->str_, obj); } // ポジション位置の文字列取得 virtual char operator[](int pos) const { return this->str_[pos]; } // 文字列ゲッツ virtual char * c_str() const { return str_; } // サイズ取得 virtual int size() const { return strlen(str_); } // 書式付フォーマット virtual String format(char *format, ...) const { va_list list; va_start(list, format); vsprintf(this->str_, format, list); return *this; } };
Luaで、string.formatっていうのがあって、
とても便利なので、使い勝手をこのクラスで真似してみた。
あと、可変長リストの練習も兼ねていたかも。
他には、数字の扱いに若干強いかな、十進法以外にも転記できる……とかいう程度かな。
しかし、自分でこのクラスを全く使っていないっていうオチ、えへへ。