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っていうのがあって、
とても便利なので、使い勝手をこのクラスで真似してみた。
あと、可変長リストの練習も兼ねていたかも。
他には、数字の扱いに若干強いかな、十進法以外にも転記できる……とかいう程度かな。


しかし、自分でこのクラスを全く使っていないっていうオチ、えへへ。