728x90
728x90
Account 클래스에 깊은 복사를 진행하는 복사 생성자를 정의해본다. 깊은 복사를 원칙으로 한다면 클래스의 생성자만 봐도 복사 생성자의 필요성을 판단할 수 있다. 실제 복사 생성자의 호출여부는 중요하지 않으며 클래스는 그 자체로 완성품이 되어야 하기 때문에 당장 필요한 것만으로 채우지 않는다.
과거 진행한 OOP 단계별 프로젝트
[윤성우 열혈 c++] 01-6 OOP 단계별 프로젝트 01단계
[윤성우 열혈 c++] OOP 단계별 프로젝트 02단계
프로그램 설명
Account 클래스에 깊은 복사를 진행하는 복사 생성자를 정의해본다.
복사생성자가 호출되진 않지만 깊은 복사를 원칙으로 정하고, 이를 위한 복사생성자를 추가한다.
//은행 계좌 관리 프로그램 3
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
const int NAME_LEN = 20; //이름의길이
void ShowMenu(void); //메뉴출력
void MakeAccount(void); //계좌개설
void DepositMoney(void); //입금
void WithdrawMoney(void); //출금
void ShowAllAccInfo(void); //잔액조회
//1. 계좌개설
//2. 입금
//3. 출금
//4. 계좌번호 전체 출력
//5. 프로그램 종료
enum { MAKE = 1, DEPOSIT, WITHDRAW, INQUIRE, EXIT };
class Account {
private:
int accID; //계좌 ID
int balance; // 잔액
char* cusName; //고객이름
public:
// 생성자, 소멸자
Account(int _accID, int _balance, char* _name) // 계좌개설 - ID, 고객이름, 돈
: accID(_accID), balance(_balance)
{
cusName = new char[strlen(_name) + 1]; //고객이름 객체 포인터로 동적할당
strcpy(cusName, _name);
}
// 실제 호출되지는 않는 복사생성자
// 깊은 복사를 원칙으로 정의
Account(const Account& ref)
: accID(ref.accID), balance(ref.balance)
{
cusName = new char[strlen(ref.cusName) + 1]; //고객이름 객체 포인터로 동적할당
strcpy(cusName, ref.cusName);
}
~Account()
{
delete []cusName;
}
// ID
int GetAccID()
{
return accID;
}
// 입금
void Deposit(int money)
{
balance += money;
}
// 출금
int WithDraw(int money) {
if (balance < money) //잔액<출금액
{
return 0;
}
balance -= money;
return money;
}
// 개인 계좌조회
void ShowAccInfo() {
cout << "계좌ID: " << accID << endl;
cout << "이름: " << cusName << endl;
cout << "잔액: " << balance << endl << endl;
}
};
Account* accArr[100]; //Account 저장을 위한 배열
int accNum = 0; //저장된 Account 수
int main()
{
int choice;
while (1)
{
ShowMenu();
cout << "선택(1~5까지의 숫자만 입력) : ";
cin >> choice;
cout << endl;
switch (choice)
{
case MAKE:
MakeAccount();
break;
case DEPOSIT:
DepositMoney();
break;
case WITHDRAW:
WithdrawMoney();
break;
case INQUIRE:
ShowAllAccInfo();
break;
case EXIT:
return 0;
default:
cout << "잘못된 선택" << endl;
}
}
return 0;
}
//메뉴출력
void ShowMenu(void) {
cout << "-----Menu-----" << endl;
cout << "1. 계좌개설" << endl;
cout << "2. 입금" << endl;
cout << "3. 출금" << endl;
cout << "4. 계좌번호 전체 출력" << endl;
cout << "5. 프로그램 종료" << endl;
}
//계좌개설
void MakeAccount(void)
{
int id;
char name[NAME_LEN];
int balance;
cout << "[계좌개설]" << endl;
cout << "계좌ID:(숫자로 입력) "; cin >> id;
cout << "이름: "; cin >> name;
cout << "입금액: "; cin >> balance;
cout << endl;
accArr[accNum++] = new Account(id, balance, name);
}
//입금
void DepositMoney(void) {
int money;
int id;
cout << "[입 금]" << endl;
cout << "계좌ID: "; cin >> id;
cout << "입금액: "; cin >> money;
for (int i = 0; i < accNum; i++)
{
if (accArr[i]->GetAccID() == id)
{
accArr[i]->Deposit(money);
cout << "입금완료" << endl << endl;
return;
}
}
cout << "유효하지 않은 ID 입니다." << endl << endl;
}
//출금
void WithdrawMoney(void) {
int money;
int id;
cout << "[출 금]" << endl;
cout << "계좌ID: "; cin >> id;
cout << "출금액: "; cin >> money;
for (int i = 0; i < accNum; i++)
{
if (accArr[i]->GetAccID() == id)
{
if (accArr[i]->WithDraw(money) == 0) //잔액보다 출금액이 크면
{
cout << "잔액부족" << endl << endl;
return;
}
cout << "출금완료" << endl << endl;
return;
}
}
cout << "유효하지 않은 ID 입니다" << endl << endl;
}
// 전체고객 잔액조회
void ShowAllAccInfo(void)
{
for (int i = 0; i < accNum; i++)
{
accArr[i]->ShowAccInfo();
}
}
728x90
728x90
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
[윤성우 열혈 c++] OOP 단계별 프로젝트 04단계 (0) | 2021.11.04 |
---|---|
[윤성우 열혈 C++] 09. Virtual의 원리와 다중상속 (책) (0) | 2021.11.02 |
[윤성우 열혈 c++] OOP 단계별 프로젝트 02단계 (0) | 2021.11.01 |
[윤성우 열혈 C++] 09. Virtual의 원리와 다중상속 (영상) (0) | 2021.11.01 |
08.상속과 다형성 - 2. 가상함수 (0) | 2021.10.14 |