AccountHandler.h

#ifndef __AccountHandler_H__

#define __AccountHandler_H__


#include "Account.h"

#include "AccountArray.h"


class AccountHandler

{

private:

Account *accArr[100];

int accCnt;

int infoCount; //삭제해도 될듯?

public:

AccountHandler();

void SelectMenu(); //선택메뉴

void MakeAccount(); // 계좌 개설 함수

void DepositMoney(); //입금 함수

void WithdrawMoney(); //출금 함수

void ShowAllAccountInfo() const; // 계좌 정보 출력

};


#endif


AccountHandler.cpp

#include "BankingCommonDecl.h"

#include "AccountHandler.h"

#include "NormalAccount.h"

#include "HighCreditAccount.h"

#include "String.h"



AccountHandler::AccountHandler()

: accCnt(0),infoCount(1)

{

//empty

}

void AccountHandler::SelectMenu() //메뉴선택 함수

{

cout<<"----Menu----"<<endl;

cout<<"1. 계좌개설"<<endl;

cout<<"2. 입    금"<<endl;

cout<<"3. 출    금"<<endl;

cout<<"4. 계좌정보 전체 출력"<<endl;

cout<<"5. 프로그램 종료"<<endl;

}


void AccountHandler::MakeAccount() //계좌개설 함수

{

//char cn[50]

String cn; //고객이름 

int select; //보통,신용계좌 선택

int id; //계좌 번호

int bal; // 잔액

int ir; //이자율

char grade; //신용등급 

/************************************/

cout<<"[계좌 종류 선택]"<<endl;

cout<<"1.보통예금 계좌  2.신용예금 계좌"<<endl<<endl;

cout<<"선택 : "; cin>>select;

cout<<endl;

while(1)

{

if(select == 1)

{

cout<<"[보통예금계좌 개설]"<<endl;

cout<<"계좌 ID :"; cin>>id; //계좌 번호

cout<<"이 름 : "; cin>>cn; //고객 이름

cout<<"입금액 : "; cin>>bal; //잔액

cout<<"이자율 : 3%"<<endl<<endl;

accArr[accCnt] = new NormalAccount(cn,id,bal);

break;

}

else if(select == 2)

{

cout<<"[신용신뢰계좌 개설]"<<endl;

cout<<"계좌 ID :"; cin>>id; //계좌 번호

cout<<"이 름 : "; cin>>cn; //고객 이름

cout<<"입금액 : "; cin>>bal; //잔액

cout<<"이자율 : 5%"<<endl;

cout<<"신용등급(1toA, 2toB, 3toC): "; cin>>grade; //신용등급

cout<<endl;


if(grade == 'a' || grade == 'A') // 추가 이자율 7%

{

accArr[accCnt] = new HighCreditAccount(cn,id,bal,CreditGrade::Grade_A);

break;

}

else if(grade == 'b' || grade == 'B') //추가 이자율 4%

{

accArr[accCnt] = new HighCreditAccount(cn,id,bal,CreditGrade::Grade_B);

break;

}

else if(grade == 'c' || grade == 'C') //추가 이자율 2%

{

accArr[accCnt] = new HighCreditAccount(cn,id,bal,CreditGrade::Grade_C);

break;

}

else

{

cout<<"존재하지 않는 신용등급입니다."<<endl;

break;

}

}

else

{

cout<<"***다시 선택해 주세요***"<<endl;

break;

}

}

/************************************/


accCnt++;

if(accCnt>100)

{

cout<<"계좌 정보가 가득 차 개설할 수없습니다"<<endl;

return;

}

}


void AccountHandler::DepositMoney() //입금 함수

{

int id;

int money; //입금액

cout<<"[입   금]"<<endl;

cout<<"계좌 ID : "; cin>>id;

for(int i=0; i<accCnt; i++)

{

if(accArr[i]->GetID() == id) 

{

cout<<"입금액 : "; cin>>money;

accArr[i]->Deposit(money);

cout<<"입금이 완료 되었습니다"<<endl;

cout<<"잔액 : "<<accArr[i]->GetMoney()<<endl<<endl;

return;

}

}

cout<<"유효하지 않은 계좌번호입니다"<<endl;

cout<<endl;

return;

}


void AccountHandler::WithdrawMoney() //출금 함수

{

int id;

int money; //출금액

cout<<"[출   금]"<<endl;

cout<<"계좌 ID : "; cin>>id;

for(int i=0; i<accCnt; i++)

{

if(accArr[i]->GetID() == id) // 계좌번호 검사

{

cout<<"출금액 : "; cin>>money;

if(accArr[i]->GetMoney() >= money)

{

accArr[i]->Withdraw(money);

cout<<"출금이 완료 되었습니다"<<endl;

cout<<"잔액 : "<<accArr[i]->Withdraw(money)<<endl;

cout<<endl;

return;

}

else

{

cout<<"잔액이 부족합니다"<<endl;

cout<<endl;

return;

}

}

cout<<"유효하지 않은 계좌번호입니다"<<endl;

cout<<endl;

return; 

}


void AccountHandler::ShowAllAccountInfo() const// 계좌정보 출력

// 오버라이딩후 virtual 선언이 필요할듯

{

for(int i=0; i<accCnt; i++)

accArr[i]->ShowAccountInfo(); //ShowAccountInfo 오버라이딩

return;

}


HighCreditAccount.h

#ifndef __HighCreditAccount_H__

#define __HighCreditAccount_H__


#include "Account.h"

#include "String.h"


class HighCreditAccount : public Account //신용신뢰 계좌

{

//Account 클래스를 상속하므로 Account 클래스를 초기화할 의무를 가져야한다

private:

int interestRate; //이자비율

int additional_ir; //등급에 따른추가이율

public:

//HighCreditAccount(char* custName,int id,int balance,int grd);

HighCreditAccount(String custName,int id,int balance,int grd);

virtual int GetMoney() const; //가상함수 선언

virtual int Withdraw(int money);

};


#endif


HighCreditAccount.cpp

#include "HighCreditAccount.h"


//HighCreditAccount::HighCreditAccount(char* custName,int id,int balance,int grd);

HighCreditAccount::HighCreditAccount(String custName,int id,int balance,int grd)

: interestRate(5),Account(custName,id,balance)

{

additional_ir = interestRate + grd; // 기본 이율 + 등급에 따른 추가이율

}


int HighCreditAccount::GetMoney() const

{

return Account::GetMoney() + Account::GetMoney()*additional_ir/100;

// 클래스내에서 이미 등급에따른 추가 이자율 계산을 따로 끝낸 상태,여기서 해주는게 더 깔끔하게 보일까?

}


int HighCreditAccount::Withdraw(int money)

{

return GetMoney()-money;

}

NormalAccount.h

#ifndef __NormalAccount_H__

#define __NormalAccount_H__


#include "Account.h"


class NormalAccount : public Account //보통 예금 계좌

{

//Account 클래스를 상속하므로 Account 클래스를 초기화할 의무를 가져야한다.

private:

int interestRate; //이자비율

public:

//NormalAccount(char* custName,int id,int balance);

NormalAccount(String custName,int id,int balance); // Account의 멤버변수에 관한 정보를 makeAccount함수를 통해 전달받는다?

virtual int GetMoney() const; //GetMoney 호출시 NormalAccount GetMoney 호출

virtual int Withdraw(int money);

};


#endif


NormalAccount.cpp

#include "NormalAccount.h"


//NormalAccount::NormalAccount(char* custName,int id,int balance)

NormalAccount::NormalAccount(String custName,int id,int balance) // Account의 멤버변수에 관한 정보를 makeAccount함수를 통해 전달받는다?

: interestRate(3),Account(custName,id,balance)

{

//empty

}

int NormalAccount::GetMoney() const

{

return Account::GetMoney() + Account::GetMoney()*interestRate/100; //이자율 더해주기

}

int NormalAccount::Withdraw(int money)

{

return GetMoney()-money;

}


#ifndef __STRING_H_

#define __STRING_H_


#include "BankingCommonDecl.h"

#include "String.h"


String.h

class String

{

private:

char *std_str;

public:

String();

String(const char *str);//생성자 정의

String(const String& cpy); //복사생성자

String& operator=(const String& cpy); //대입연산자

String operator+(const String& cpy);

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

/*

동일한 정의

String& operator+=(const String& cpy)

{

*this=*this+s;

return *this;

}

*/

bool operator==(const String& cpy);

~String(); //소멸자

friend ostream& operator<<(ostream& os,const String& cpy);

friend istream& operator>>(istream& is,const String& cpy);


};

#endif


String.cpp

#include "String.h"

#include "AccountHandler.h"


String::String()

{

std_str=NULL;

}

String::String(const char *str) //생성자 정의

{

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

strcpy(std_str,str);

}

String::String(const String& cpy) //복사생성자

{

std_str=new char[strlen(cpy.std_str)+1];

strcpy(std_str,cpy.std_str);

}


String& String::operator=(const String& cpy) //대입연산자

{

if(std_str!=NULL)

delete []std_str;

std_str=new char[strlen(cpy.std_str)+1];

strcpy(std_str,cpy.std_str);


return *this;

}


String String::operator+(const String& cpy)

{

int len=strlen(std_str)+strlen(cpy.std_str)+1;

char *temp_str=new char[len];


strcpy(temp_str,std_str);

strcat(temp_str,cpy.std_str);

String temp(temp_str); //생성자호출


delete []temp_str;

return temp; //임시객체생성되면서 복사생성자 호출

}


String& String::operator+=(const String& cpy)

{

int len=strlen(std_str)+strlen(cpy.std_str)+1;

char *temp_str=new char[len];

strcpy(temp_str,std_str);

strcat(temp_str,cpy.std_str);


if(std_str!=NULL)

delete []std_str;

std_str=temp_str;

return *this;

}

/*

동일한 정의

String& operator+=(const String& cpy)

{

*this=*this+s;

return *this;

}

*/

bool String::operator==(const String& cpy)

{

if(!strcmp(std_str,cpy.std_str))

return true;

else

return false;

}


String::~String() //소멸자

{

if(std_str!=NULL)

delete []std_str;

}


ostream& operator<<(ostream& os,const String& cpy)

{

os<<cpy.std_str;

return os;

}

istream& operator>>(istream& is,String& cpy)

{

char str[100];

is>>str;

cpy=String(str); //임시객체생성(생성자호출)-> 대입연산자 호출

return is;

}

-----------------------------------------------------------
밑에 LNK2019에러난 코린이 인데 소스 한번 올려봐 ㅜㅜ 일단 소스에 대해서 간단하게 설명하면 은행계좌 프로그램을 만드는건데 뭐 실제로 사용하는 정도의 수준은아니고
그냥 책에서 한번 해보라고 수준낮게 던저준 프로젝트같은거야..암튼 이번 단계에서 주어진 문제가 아래 String.h 와 String.cpp를 이전에 만들었던 프로젝트에 추가 적용 시켜보라는거야. String 클래스는 표준라이브러리에 있는 string 클래스를 우리가 직접 정의해보라고 낸 클래스야. 이 헤더랑 소스파일은 문제없어 직접 돌리기도 했고, 답안을 보기도 했으니까. 그리고 변경전 프로젝트 소스도 문제없어 실행 다해봤으니까.

그리고 위 소스가 내가 만든 프로젝트에 String 헤더파일과 소스파일을 추가하고 String 클래스를 적용시킨 소스야. 빨간색소스가 변경후 소스
파란색 부분이 변경전 소스야..저렇게 변경했는데 자꾸 LNK2019 에러가 뜨니 돌아버리겠네 ㅜㅜ 도와주 형들.. 아래는 그 에러설명..

AccountHandler.obj : error LNK2019: "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class String const &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@ABVString@@@Z) 외부 기호(참조 위치: "public: void __thiscall AccountHandler::MakeAccount(void)" (?MakeAccount@AccountHandler@@QAEXXZ) 함수)에서 확인하지 못했습니다.
1>C:UsersSYBdocumentsisual studio 2010Projects은행계좌 프로그램Debug은행계좌 프로그램.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.