과제아니고(대학졸업한 앰창인생 백수임) 윤성우 책으로 공부하는 독학충인데 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;
}
누가 해주겠냐?
;;
해주라는게아니라 잘못된점 보이면 말해달라는건데;;
아니시발 안봐줄새끼들은 죶같은리플달지말고 걍꺼져 리플때매설레게하지말고
글설리
스샷으로가져오면 프로그램 못돌려보니까 긁어왓는데 스샷이나음?
ㅇㅇ 저번에질문올렷을땐 돌려보던데
모르겟다
근데 디버깅 할줄모름? 브레이크 포인트 잡고 몇번돌리면 금방찾을텐데..
클라이언트 makeAcnt함수에서 acntinf[Account::c-1] = new Account(acntID, tempName, money); 이걸로 고쳐봐
디버깅아직할줄모름 독학충이라 ㅠ 바꿔볼게 고마워형
맨첨에 c는0인데 어카운트 생성자에서 c++; 해주잖아 그럼 c가 1이되는데 acntinf[Account::c] = new Account(acntID, tempName, money); 여기서 c가 1이니까 당연히 뻑나지 [0]에는 안들어가니까 쓰레기를 가리키는데
모바일이라 읽기도 쓰기도힘드네ㅋㅋ 근데 디버깅부터 공부하셈 그냥 f9로 브레이크 포인트 잡고 f11 f5 f10눌러보면서 값변화보면 되는데ㅋㅋ
어 바꾸니까 되네. ㅋㅋㅋㅋ아 맞네 오른쪽게 먼저실행된다는걸간과했네 진짜고마워형 썩은코드 봐주느라고생했어
응 디버깅도 공부해야겠다 컴파일에서안잡히는 오류를 못잡겠어 개빡쳐 ㅋㅋ