2016-08-15 6 views
-3

これを把握するのに苦労しています。これまでのところ私のプロジェクトの他のものはすべて動作していますが、オブジェクトの配列に追加しようとするとクラッシュします。私は文字列を読むことができないというエラーを得る。これはメッセージです、私はとても多くのことを試みました。ここにエラーがあり、SetNewAccountInfo()関数の入力後にクラッシュします。私はプログラミングに慣れていないので、このコードがここで正しくフォーマットされていることを願っています。これは学校のプロジェクトなので、私は答えを求めていない、たぶんちょうど私が私の配列に一般人の言葉で追加することができない理由を説明するかもしれない。これまでポインタなどは混乱しています。アレイに追加するときにエラーを特定できません

static _Elem *__CLRCALL_OR_CDECL copy(_Elem *_First1, const _Elem *_First2, size_t _Count) 
{ // copy [_First2, _First2 + _Count) to [_First1, ...) 
    **return (_Count == 0 ? _First1** : (_Elem *)_CSTD memcpy(_First1, _First2, _Count)); 
} 

// TestClassC.cpp : main project file. 

#include "stdafx.h" 
#include "BankClassType.h" 

#include <iostream> 
#include <conio.h> 
#include <string> 
#include <ostream> 


using namespace std; 
void MainMenu(BankClassType bo[],int num, int cAcct); 
void AcctOptionsMenu(BankClassType bo[], int num, int cAcct); 
int SetNewAccountInfo(); 
void PrintAccountInfo(); 
void AccountDeposit(); 
void AccountWithdrawal(); 
int main() 
{ 
    const int num = 4; 

    BankClassType *bo = new BankClassType[num]; 
    BankClassType b; 
    BankClassType bo0("12345", 'P', "Gates", "Bill", 175253.99, 6875250.23); 
    BankClassType bo1("12346", 'R', "Jones", "Tommy", 845.21, 2700.00); 
    BankClassType bo2("12347", 'P', "Asimov", "Isaac", 300.67, 14750.29); 
    bo[0] = bo0; 
    bo[1] = bo1; 
    bo[2] = bo2; 
    int cAcct = 3; 
    b.MainMenu(bo, num, cAcct); 

    _getch(); 
    return 0; 
} 

//BankClassType.h File 
#pragma once 
#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <string> 
#include <ostream> 
#ifndef BankClassType_h 
#define BankClassType_h 

using namespace std; 

class BankClassType 
{ 
private: 
    string AccountNumber; 
    string FirstName; 
    string LastName; 
    double CheckingBalance; 
    double SavingsBalance; 
    char AccountType; 
public: 
    BankClassType() 
    { 
     FirstName = ""; 
     LastName = ""; 
     AccountNumber = ""; 
     AccountType = 'p'; 
     CheckingBalance = 0; 
     SavingsBalance = 0; 
    } 
    BankClassType(string acctNumber, char acctType, string lname, string fname, double cBal, double sBal); 

    //~BankClassType(); 
    void SetNewAccountInfo(BankClassType bo[], int num, int cAcct); 
    void PrintAccountInfo(); 
    void AccountDeposit(BankClassType bo[], int number, int num, int cAcct); 
    void AccountWithdrawal(BankClassType bo[], int number, int num, int cAcct); 
    void AcctOptionsMenu(BankClassType bo[], int num, int cAcct); 
    void MainMenu(BankClassType bo[], int num, int cAcct); 

    //void ExistingAccounts(string acctNumber, char acctType, string lname, string fname, double cBal, double sBal); 
    string getAccountNumber() 
    { 
     return AccountNumber; 
    } 
    char getAccountType() 
    { 
     return AccountType; 
    } 
    double getCheckingBalance(double amount) 
    { 
     CheckingBalance = CheckingBalance + amount; 
     return CheckingBalance; 
    } 
    double getSavingsBalance(double amount) 
    { 
     SavingsBalance = SavingsBalance + amount; 
     return SavingsBalance; 
    } 
    double getWithdrawalCheckingBalance(double amount) 
    { 
     CheckingBalance = CheckingBalance - amount; 
     return CheckingBalance; 
    } 
    double getWithdrawalSavingsBalance(double amount) 
    { 
     SavingsBalance = SavingsBalance - amount; 
     return SavingsBalance; 
    } 
    string getFirstName() 
    { 
     return FirstName; 
    } 
    string getLastName() 
    { 
     return LastName; 
    } 
}; 


#endif 

//BankClassImp.cpp 
#include "stdafx.h" 
#include "BankClassType.h" 
#include <iostream> 
#include <conio.h> 
#include <string> 
#include <ostream> 


using namespace std; 

BankClassType::BankClassType(string acctNumber, char acctType, string lname, string fname, double cBal, double sBal) 
{ 
    AccountNumber = acctNumber; 
    AccountType = acctType; 
    LastName = lname; 
    FirstName = fname; 
    CheckingBalance = cBal; 
    SavingsBalance = sBal; 
    /*cout << "\nName: " << LastName << ", " << FirstName; 
    cout << "\nAccountNumber: " << AccountType << AccountNumber; 
    cout << "\nChecking Balance: " << CheckingBalance; 
    cout << "\nSavings Balance: " << SavingsBalance<<endl; 
    */ 
} 

/*BankClassType::~BankClassType() 
{ 
delete[] FirstName; 
delete[] LastName; 
delete[] AccountNumber; 
delete[] AccountType; 
}*/ 

void BankClassType::SetNewAccountInfo(BankClassType bo[], int num, int cAcct) 
{ 
    //BankClassType * bt = new BankClassType; 
    BankClassType c; 

    string fName; 
    string acctNum; 
    string lName; 
    char accType; 
    double cBal, sBal; 
    if (cAcct >= 5) 
    { 
     "Sorry the accounts are currently full, press any key to return to main menu: "; 
     c.MainMenu(bo, num, cAcct); 
     _getch(); 
    } 
    else 
    cout << "\nEnter the 5 digit account number: "; cin >> acctNum; 
    cout << "\nEnter the account type (p) or (r): ";  cin >> accType; 
    cout << "\nEnter the first name: "; cin >> fName; 
    cout << "\nEnter the last name: "; cin >> lName; 


    cout << "\nEnter the checking balance: "; cin >> cBal; 
    cout << "\nEnter the savings balance: "; cin >> sBal; 
    BankClassType bo3(acctNum, accType, lName, fName, cBal, sBal); 
    bo[cAcct + 1] = bo3; 
} 


void BankClassType::PrintAccountInfo() 
{ 
    cout << "Name: " << LastName << ", " << FirstName; 
    cout << "\nAccountNumber: " << AccountType << AccountNumber; 
    cout << "\nChecking Balance: " << CheckingBalance; 
    cout << "\nSavings Balance: " << SavingsBalance << endl << endl; 

} 

void BankClassType::AccountDeposit(BankClassType bo[], int number, int num, int cAcct) 
{ 
    int choice; 
    BankClassType b; 
    cout << "\nEnter 1 for checking or 2 for savings: "; 
    cin >> choice; 
    if (choice == 1) 
    { 
     double amount; 
     cout << "Enter amount to deposit into checking: " << endl; 
     cin >> amount; 
     bo[number].getCheckingBalance(amount); 
     cout << "You added $" << amount << " to checking account number " << bo[number].getAccountNumber(); 
     _getch(); 
     b.MainMenu(bo, num, cAcct); 
    } 
    else if (choice == 2) 
    { 
     double amount; 
     cout << "Enter amount to deposit into savings: " << endl; 
     cin >> amount; 
     bo[number].getSavingsBalance(amount); 
     cout << "You added $" << amount << " to savings number" << bo[number].getAccountNumber(); 
     _getch(); 
     b.MainMenu(bo, num, cAcct); 
    } 
    else 
    { 
     cout << "Incorrect Input, try again: "; 
     _getch(); 
     AccountDeposit(bo, number, num, cAcct); 
    } 
} 

void BankClassType::AccountWithdrawal(BankClassType bo[], int number, int num, int cAcct) 
{ 
    int choice; 
    BankClassType b; 
    cout << "\nEnter 1 for checking or 2 for savings: "; 
    cin >> choice; 
    if (choice == 1) 
    { 
     double amount; 
     cout << "Enter amount to withdrawal from checking: " << endl; 
     cin >> amount; 
     bo[number].getWithdrawalCheckingBalance(amount); 
     cout << "You withdrew $" << amount << " from checking account number " << bo[number].getAccountNumber(); 
     cout << "\nPress any key to return to main menu: "; 
     _getch(); 
     b.MainMenu(bo, num, cAcct); 
    } 
    else if (choice == 2) 
    { 
     double amount; 
     cout << "Enter amount withdrawal from savings: " << endl; 
     cin >> amount; 
     bo[number].getWithdrawalSavingsBalance(amount); 
     cout << "You withdrew $" << amount << " from savings account number " << bo[number].getAccountNumber(); 
     _getch(); 
     b.MainMenu(bo, num, cAcct); 
    } 
    else 
    { 
     cout << "Incorrect Input, try again"; 
     _getch(); 
     AccountDeposit(bo, number, num, cAcct); 
    } 
} 

void BankClassType::MainMenu(BankClassType bo[], int num, int cAcct) 
{ 
    cout << "\nWelcome, here are the current accounts on file:\n" << endl; 
    for (int i = 0; i < cAcct; i++) 
    { 
     cout << i + 1 << "--"; 
     bo[i].PrintAccountInfo(); 
    } 
    int choice; 
    BankClassType b; 

    cout << "Enter number (1-5) of account you wish to make changes\n Enter 6 to add an account\nEnter 7 to exit\n --->"; 
    cin >> choice; 
    if (choice < 6) 
     b.AcctOptionsMenu(bo, num, cAcct); 
    else if (choice == 6) 
    { 
     bo[cAcct + 1].SetNewAccountInfo(bo, num, cAcct); 
     cout << "You have successfully added an account!" << endl; 
     _getch(); 
     cAcct++; 
     b.MainMenu(bo, num, cAcct); 
    } 
    else if (choice == 7) 
    { 
     cout << "You have exited, press any key to continue: "; 
     _getch(); 
     system("cls"); 
    } 
    else if(choice > 7) 
    { 
     cout << "Not a valid input, press a key to try again: "; 
     _getch(); 
     system("cls"); 
     MainMenu(bo, num, cAcct); 
    } 
} 
void BankClassType::AcctOptionsMenu(BankClassType bo[], int num, int cAcct) 
{ 
    char choice; 
    int check = 0; 
    int count = 0; 
    int number; 
    BankClassType b; 
    while (check == 0) { 
     cout << "\t\t\n\n" << "Main Menu"; 
     cout << "\t\n\n" << "Select by letter:"; 
     cout << "\t\n" << "(d) - Deposits"; 
     cout << "\t\n" << "(w) - Withdrawals"; 
     cout << "\t\n" << "(s) - Show Account Information."; 
     cout << "\t\n" << "(q) - Quit Program.\n\n"; 
     cout << "\t" << "Choice: "; 
     choice = _getche(); 
     switch (choice) { 
     case 'd': 
     case 'D': 
      system("cls"); 
      cout << "\nChoose Account:\n "; 
      for (int i = 0; i < cAcct; i++) cout << i +1 << "---" << bo[i].getAccountNumber()<< "\n\n" ; 
      cin >> number; 
      bo[number].AccountDeposit(bo,number, num, cAcct); 
      system("cls"); 
      break; 

     case 'w': 
     case 'W': 
      system("cls"); 
      cout << "\nChoose Account:\n "; 
      for (int i = 0; i < cAcct; i++) cout << i + 1<< "---" << bo[i].getAccountNumber() << "\n\n"; 
      cin >> number; 
      bo[number].AccountWithdrawal(bo, number, num, cAcct); 
      system("cls"); 
      break; 

     case 's': 
     case 'S': 
      system("cls"); 
      cout << "\nChoose Account:\n "; 
      for (int i = 0; i < cAcct; i++) cout << i + 1 << "---" << bo[i].getAccountNumber() << "\n\n"; 
      cin >> number; 
      bo[number].PrintAccountInfo(); 
      _getche(); 
      system("cls"); 
      break; 

     case 'q': 
     case 'Q': 
      check = 1; 
      break; 

     default: 
      cout << "\nInvalid selection. Press a key to return to main menu."; 
      _getche(); 
     } 

     if (check == 1) 
      break; 

    } 
} 
+0

ようこそスタックオーバーフロー。コードを書くときは、できるだけ孤立して新しい機能*を開発することが非常に重要です。そうすれば、何かがうまくいかないとき(今のように)、問題を見つけるために多くのコードを見る必要はありません。 – Beta

+0

mainに割り当てられた配列が短すぎるようです。 4要素のブロックを割り当て、cAcctとして '3'を渡し、次にbo [cAcct + 1] = bo3を渡します。インデックスは配列の終わりを1回通過する4になります。結果は未定義であり、クラッシュはおそらく –

+0

@ベータです。それは良いアドバイスです。 – Aaron

答えて

1

メインに割り当てられた配列が短すぎるように見えます。 4要素のブロックを割り当て、cAcctとして '3'を渡し、次にbo [cAcct + 1] = bo3を渡します。インデックスは配列の終わりを1回通過する4になります。結果は未定義であり、クラッシュする可能性があります。

関連する問題