[C++/Practice] String Class의 구현

Hand made String Class

지금까지 공부한 내용을 바탕으로 C++의 String 클래스를 직접 만들어 본다.
String Class의 기능들은 다음과 같다.

  1. 선언 방식은 String(), String(char*), String(String)이 있다.
  2. ‘==’ 연산은 두 문자열을 비교한다.
  3. ‘+’ 연산은 두 문자열을 연결한 String class를 반환한다.
  4. ‘+=’ 연산은 기존 String class에 이어 붙여 준다.
  5. ‘<<‘ 연산은 문자열을 출력(out)한다.
  6. ‘>>’ 연산은 문자열을 입력(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;
}

 

카테고리C++

“[C++/Practice] String Class의 구현”에 대한 한개의 댓글

  1. 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();

글의 문제가 있다면 댓글을 달아 주세요.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.