Hand made String Class
지금까지 공부한 내용을 바탕으로 C++의 String 클래스를 직접 만들어 본다.
String Class의 기능들은 다음과 같다.
- 선언 방식은 String(), String(char*), String(String)이 있다.
- ‘==’ 연산은 두 문자열을 비교한다.
- ‘+’ 연산은 두 문자열을 연결한 String class를 반환한다.
- ‘+=’ 연산은 기존 String class에 이어 붙여 준다.
- ‘<<‘ 연산은 문자열을 출력(out)한다.
- ‘>>’ 연산은 문자열을 입력(in)받는다.
위와 같은 기능을 하는 String class를 직접 만들어본다.
String.h Class Header
#ifndef CUS_STR #define CUS_STR #include <cstring> #include <iostream> class String { private: int len; char *str; public: String(); String(const char *s); String(const String &s); ~String(); String& operator= (const String& s); String& operator+= (const String& s); bool operator== (const String& s); String operator+ (const String& s); friend std::ostream& operator<< (std::ostream& os, const String& s); friend std::istream& operator>> (std::istream& is, String& s); }; #endif // !CUS_STR
String.cpp Class code
#include "Stringh.h" String::String() { len = 0; str = NULL; } String::String(const char *s) { len = strlen(s) + 1; str = new char[len]; strcpy(str, s); } String::String(const String& s) { len = s.len; str = new char[len]; strcpy(str, s.str); } String::~String() { if (str != NULL) delete[]str; } String& String::operator= (const String& s) { if (str != NULL) delete[]str; len = s.len; str = new char[len]; strcpy(str, s.str); return *this; } String& String::operator+= (const String& s) { len += s.len; char *tmpstr = new char[len]; strcpy(tmpstr, str); strcat(tmpstr, s.str); if (str != NULL) delete[]str; str = tmpstr; return *this; } bool String::operator== (const String& s) { return strcmp(str, s.str) ? false : true; } String String::operator+ (const String& s) { char *tmpstr = new char[len + s.len - 1]; strcpy(tmpstr, str); strcat(tmpstr, s.str); String tmp(tmpstr); delete[]tmpstr; return tmp; } std::ostream& operator<< (std::ostream& os, const String& s) { os << s.str; return os; } std::istream& operator>> (std::istream& is, String& s) { char str[100]; is >> str; s = String(str); return is; }
Main.c
#include "Stringh.h" int main() { String str1 = "Str 1"; String str2 = "Str 1"; String str3 = str1 + str2; std::cout << str1 << std::endl; std::cout << str2 << std::endl; std::cout << str3 << std::endl; str1 += str2; if (str1 == str3) std::cout << "동일!" << std::endl; else std::cout << "다름!" << std::endl; String str4; std::cout << "문자열 입력: "; std::cin >> str4; std::cout << "입력된 문자열: "; std::cout << str4 << std::endl; return 0; }
free(): double free detected in tcache 2
Aborted
Can you help me out!!
ofstream bf(“test.bin”, ios::binary);
bf.write((char*)&str1, sizeof(String));
bf.close();
String str5;
ifstream ifile(“test.bin”, ios::binary);
ifile.read((char*)&str5, sizeof(String));
ifile.close();