C++

열혈 C++ 프로그래밍 OOP 프로젝트 09

나른한여우 2024. 4. 3. 19:28

09에서는 직접 정의한 string 클래스를 가지고 기존 프로젝트의 char를 string으로 대체함

String클래스를 정의한 String.cpp, String.h 파일 추가

기존에 Account내에 존재하는 복사 생성자, 대입 연산자, 소멸자는 String 클래스가 추가됨에 따라서

사용하지않게되므로 주석 처리해줌

 

1. String.h

#ifndef __STRING_H__
#define __STRING_H__
#include "BankingCommonDec1.h"

class String
{
private:
	int len;
	char* string;
public:
	String();
	String(const char* str);
	String(const String& str);
	String& operator=(const String& str);
	~String();
	String& operator+=(const String str);
	bool operator==(const String str);
	String operator+(const String& str);
	friend ostream& operator<<(ostream& os, const String& str);
	friend istream& operator>>(istream& is, String& str);
};

#endif

 

2. String.cpp

#include "String.h"

String::String()
{
	len = 0;
	string = NULL;
}
String::String(const char* str)
{
	len = strlen(str) + 1;
	string = new char[len];
	strcpy_s(string, len, str);
}
String::String(const String& str)
{
	len = str.len;
	string = new char[len];
	strcpy_s(string, len, str.string);
}
String& String::operator=(const String& str)
{
	delete[]string;
	len = str.len;
	string = new char[len];
	strcpy_s(string, len, str.string);
	return *this;
}
String::~String()
{
	delete string;
}
String& String::operator+=(const String str)
{
	len += (str.len - 1);
	char* tempstr = new char[len];
	strcpy_s(tempstr, len, string);
	strcat_s(tempstr, len + str.len - 1, str.string);
	delete[]string;
	string = tempstr;
	return *this;
}
bool String::operator==(const String str)
{
	if (strcmp(string, str.string) == 0)
		return true;
	else
		return false;
}
String String::operator+(const String& str)
{
	char* tempstr = new char[len + str.len - 1];
	strcpy_s(tempstr, len, string);
	strcat_s(tempstr, len + str.len - 1, str.string);
	String temp(tempstr);
	delete[]tempstr;
	return temp;
}
ostream& operator<<(ostream& os, const String& str)
{
	os << str.string;
	return os;
}
istream& operator>>(istream& is, String& str)
{
	char tempstr[100];
	is >> tempstr;
	str = String(tempstr);
	return is;
}

 

3. 변경된 Account.cpp

#include "Account.h"
#include "BankingCommonDec1.h"

Account::Account(const int id, int money, const String name)
	:accId(id), balance(money)
{
	//cusName = new char[strlen(name) + 1];
	//strcpy_s(cusName, strlen(name) + 1, name);
	cusName = name;
}
//Account::Account(const Account& ac)
//	:accId(ac.accId), balance(ac.balance)
//{
//	cusName = new char[strlen(ac.cusName) + 1];
//	strcpy_s(cusName, strlen(ac.cusName) + 1, ac.cusName);
//}
int Account::GetAccId() const
{
	return accId;
}
void Account::Deposit(int money)
{
	balance += money;
}
int Account::WithDraw(int money)
{
	if (balance < money)
	{
		return 0;
	}
	balance -= money;
	return money;
}
void Account::ShowAccount() const
{
	cout << "계좌번호: " << accId << endl;
	cout << "고객이름: " << cusName << endl;
	cout << "잔 액: " << balance << endl << endl;
}
//08 Account 대입연산자 추가
//Account& Account::operator=(const Account& ac)
//{
//	accId = ac.accId;
//	balance = ac.balance;
//	delete[]cusName;
//	cusName = new char[strlen(ac.cusName) + 1];
//	strcpy_s(cusName, strlen(ac.cusName) + 1, ac.cusName);
//	return *this;
//}
//Account::~Account()
//{
//	delete[]cusName;
//}

 

그 외 char를 사용해 문자열을 만드는 부분들역시 String으로 변경해줌

string을 사용하지않고 String으로 직접 정의해 사용한 이유는 앞서 공부한 연산자 오버로딩을

복습하는 의미에서 변경