과제아니고(대학졸업한 앰창인생 백수임) 윤성우 책으로 공부하는 독학충인데 C언어책 1회독하고 이제 C++책 보면서 공부중이거든


그래서 책공부하면서 짠 코드인데 프로그램기능은 그냥 '은행계좌 생성, 입금, 출금, 계좌정보출력' 이정도이구


원래는 잘 돌아가던게 단지 전역변수를 static 멤버변수로 바꿨는데 오류가나서 몇시간동안 해매다가 결국 여기 올려본다..

중요부분은 빨간색으로표시해놨어



==========================================================================================

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>

#include<cstring>

#include<cstdio>

using namespace std;


class Account;

Account * acntinf[100];


class Account

{

private:

int acntID;

char * name;

int money;

public:

static int c; //원래 전역변수로 처리하던걸 public static으로바꿔봄

public:

Account(int acntID, char * name, int money) :acntID(acntID), money(money)

{

c++;

this->name = new char[strlen(name) + 1];

strcpy(this->name, name);

//cout << "계좌ID테스트: "<<getID()<<endl;//테스트

}


Account(const Account& copy) :acntID(copy.acntID), money(copy.money)

{

name = new char[strlen(copy.name) + 1];

strcpy(name, copy.name);

}


~Account()

{

delete[]name;

}


int getID()

{

return acntID;

}


void printName()

{

cout << name << endl;

}


int getMoneyInf()

{

return money;

}


void moneyUp(int money)

{

this->money += money;

}


void moneyDown(int money)

{

this->money -= money;

}

};

int Account::c = 0;



class Client

{

char tempName[30];

int acntID;

int money;


public:

void makeAcnt(void)

{

cout << endl << "[계좌계설]" << endl << "계좌 ID: ";

cin >> acntID;

cout << "이름: ";

cin >> tempName;

//cout << tempName<<endl;//테스트용=====

cout << "입금액: ";

cin >> money;


acntinf[Account::c] = new Account(acntID, tempName, money);

}


void putMoney(void)

{

int temp;

cout << endl << "[입    금]" << endl << "계좌ID: ";

cin >> temp;


cout << "입금액: ";

cin >> money;


for (int i = 0; i < Account::c; i++)

{

if (temp == acntinf[i]->getID())

//이부분에서 에러남 컴파일은 정상적으로됨. acntinf[i]가 들어가는 모든 코드 호출시 런타임오류. i를 Account::c 로 대체할경우는 에러가 안남.


디버그모드 실행시 Unhandled exception at 0x001F68E6 in _test.exe: 0xC0000005: Access violation reading location 0x00000000. 라고 뜸

{

acntinf[i]->moneyUp(money);

cout << "입금완료" << endl;

return;

}

}

cout << endl << "ID가 없습니다" << endl;

}


void getMoney(void)

{

int temp;

int money = -1;

cout << endl << "[출    금]" << endl << "계좌ID: ";

cin >> temp;


cout << "출금액: ";

cin >> money;


for (int i = 0; i < Account::c; i++)

{

if (temp == acntinf[i]->getID())

{

acntinf[i]->moneyDown(money);

if (acntinf[i]->getMoneyInf() < 0)

{

cout << "잔액 부족" << endl;

acntinf[i]->moneyUp(money);

return;

}

else

{

cout << "출금완료" << endl;

return;

}

}

}

cout << endl << "ID가 없습니다" << endl;

}


~Client()

{

delete acntinf[Account::c];

}

};


class Printer

{

public:

int print_menu(void)

{

int a;

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

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

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

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

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

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


do

{

cout << "선택: ";

cin >> a;

} while (a != 1 && a != 2 && a != 3 && a != 4 && a != 5);


return a;

}


void printAll(void)

{

for (int i = 0; i < Account::c; i++)

{

cout << "i테스트 " << i << endl;

cout << "계좌ID테스트: " << acntinf[i]->getID() << endl;

//cout << endl << "계좌ID: " << acntinf[i]->getID() << endl;

//cout << "이 름: "; acntinf[i]->printName();

//cout << "잔 액: " << acntinf[i]->getMoneyInf() << endl;

}

}

};


int main(void)

{

int sel;

Client user;

Printer printerer;


while (1)

{

sel = printerer.print_menu();


switch (sel)

{

case 1:

user.makeAcnt();

break;

case 2:

user.putMoney();

break;

case 3:

user.getMoney();

break;

case 4:

printerer.printAll();

break;

case 5:

cout << endl << "프로그램을 종료합니다" << endl;

return 0;

default:

break;

}

}


return 0;

}