Creative Code

string4(reference counting사용) 본문

C++ Programming

string4(reference counting사용)

빛하루 2023. 9. 5. 11:51

※main.cpp파일

#include <iostream>

#include "string.h"



int main() {

	String s1;

	String s2 = "hello, world";     // String s2("hello,world");

	//String s2 = 0;						// NULL

	String s3 = s2;                 // String s3(s2);

	s1 = s2;

	

	String s4 = " IoT";

	s1 = s2 + s4;

	s1 = "hello, ";                 //String tmp("hello, ");

	

	if (s1 == s2) std::cout << "s1 and s2 are equal" << std::endl;

	else std::cout << "s1 and s2 are not equal" << std::endl;

	

	s4+= s4;

	s1 != s2;

	std::cout << "s1 : " << s1.c_str() << std::endl;

	std::cout << "s2 : " << s2.c_str() << std::endl;

	std::cout << "s2 len : " << s2.size() << std::endl;

	

	std::cout << "s3 : " << s3 <<std::endl;

	

	const String s5 = "hello";

	//s5 = "world";

	std::cout << "s5 len : " << s5.size() << std::endl;

	return 0;

}

※string.h파일

#ifndef STRING_H

#define STRING_H

#include <iostream>

#include "stringRep.h"







class String {

friend std::ostream& operator<<(std::ostream& out, const String& rhs);



private:

	//char *str;

	//int len;

	//void init_str(const char *str); // tool function, helper function(다른 멤버함수들에 의해서만 사용되는 함수)

	StringRep *rep_;

public:

	String(const char *str=0);

	String(const String& str);

	~String();

	

	String& operator=(const String& rhs);

	String& operator=(const char* str);

	

	String& operator+=(const String& rhs);

	bool operator!=(const String& rhs) const;

	bool operator==(const String& rhs) const;           // const member function (객체에 대해서 read only)

	const String operator+(const String& rhs) const;

	const char* c_str() const;

	const int size() const;

	

};

#endif

※string.cpp파일

#include "string.h"

#include <cassert>

#include <cstring>





std::ostream& operator<<(std::ostream& out, const String& rhs) {

	//out << rhs.rep_->str_;

	return out << rhs.c_str();

}





String::String(const char *str) {

	rep_ = new StringRep(str);

	rep_ ->rc_ = 1;

}



String::String(const String& rhs) {

	rep_ = rhs.rep_;

	++rep_->rc_;

}



String::~String() {

	--rep_->rc_;

	if (rep_->rc_ == 0) {

		delete rep_;

	}

}



const char *String::c_str() const{

	return rep_->str_;

}



const int String::size() const {

	return rep_->len_;

}



String& String::operator=(const String& rhs) {

	if (this != &rhs) {   		//self-assignment test!

		--rep_->rc_;

		if (rep_->rc_ == 0) {

			delete rep_;

		}

		rep_ = rhs.rep_;

		++rep_ ->rc_;

	}

	return *this;

}



String& String::operator=(const char *str) {

	--rep_ ->rc_;

	if (rep_->rc_ == 0) {

		delete rep_;

	}

	rep_ = new StringRep(str);

	rep_ ->rc_ = 1;

	return *this;

}



bool String::operator==(const String& rhs) const{

	return (strcmp(rep_->str_,rhs.rep_->str_)==0);

}



const String String::operator+(const String& rhs) const {

	char *buf = new char[rep_->len_ + rhs.rep_->len_+1];

	assert(buf);

	strcpy(buf,rep_->str_);

	strcat(buf,rhs.rep_->str_);

	String result(buf);

	delete[] buf;

	return result;

}



String& String::operator+=(const String& rhs) {

	*this = *this + rhs;

	return *this;

}



bool String::operator!=(const String& rhs) const{

	return !this->operator==(rhs);

}

※stringRep.h파일

#ifndef STRINGREP_H

#define STRINGREP_H



class StringRep{

friend class String;

private:

	char *str_;

	int len_;

	int rc_;

	StringRep(const StringRep& rhs);

	StringRep& operator=(const StringRep& rhs);

public:

	StringRep(const char* str = 0);

	~StringRep();

};

#endif

※stringRep.cpp파일

#include <cassert>

#include <cstring>

#include "stringRep.h"



StringRep::StringRep(const char *str) {

	if (str) {

		str_ = new char[strlen(str)+1];

		assert(str_ );

		strcpy(str_, str);

		len_ = strlen(str);

	} else {

		str_ = new char[1];

		assert(str_);

		str_[0] = '\0';

		len_ = 0;

	}

}



StringRep::~StringRep() {

	delete[] str_;

}

'C++ Programming' 카테고리의 다른 글

array(array 클래스)  (0) 2023.09.05
list2(linked list 클래스 연결)  (0) 2023.09.05
string3(string 클래스 개선)  (0) 2023.09.05
add.cpp(cin으로 입력받기)  (0) 2023.09.05
main.cpp(Rational클래스 라이브러리)  (0) 2023.09.04