プロジェクトで問題が発生し、最初から別の方法で設計する必要があったのではないかと考えています。
目標は、継承と仮想関数を持つクラスを使用する必要がある、メニュー駆動型の銀行プロジェクトを設計することです。親クラスは 'Account' で、2 つの子クラスは 'Checking' と 'Savings' です。
メインから呼び出される関数としてメニューを設計することでプロジェクトを開始し、サブメニュー関数内からクラスの適切な仮想メンバー関数を呼び出すつもりでした。私が遭遇した問題は、各クラスのインスタンスが、それが作成された関数内からのみアクセスできることです.
グローバルとしてそれらをヘッダーにドロップすることは、物事を処理する最も受け入れられた方法ではないことを知っています。シングルトンについて読んだことがありますが、私の質問は、これを処理する正しい方法ですか、それとも問題に間違ってアプローチしただけですか?皮切りに?このサイトや他のサイトに関する多くのコメントは、これが必要な場合、クラスの設計が間違っていることを示しているようです。
以下のコードは、これまでにレイアウトしたものの一部を示しています。他のメニュー オプション用にさらに関数を作成する予定でしたが、それらはすべてクラスのインスタンスにアクセスする必要があります。
#include<iostream>
#include<string>
#include"Account.h"
#include"Checking.h"
#include"Savings.h"
using namespace std;
void regScreen(), servicesScreen(), checkingScreen(), savingsScreen(), centerString(string);
double validCurrency(string);
const double CHECKING_RATE = .025, SAVINGS_RATE = .0375;
const double CHECKING_START_BAL = 0, SAVINGS_START_BAL = 0;
int main()
{
regScreen();
//Create instance of Checking class
Checking checkingObject(CHECKING_START_BAL, CHECKING_RATE);
//Create instanceof Savings class
Savings savingsObject(SAVINGS_START_BAL, SAVINGS_RATE);
servicesScreen();
return 0;
}
void regScreen()
{
// user entered variables
string ssnString, nameString, titleString, accountString;
// Used to center the text.
string countString;
// Get user's name, check for null entry.
cout << "Please enter your full name: ";
getline(cin, nameString);
while (nameString == "")
{
cout << endl << "Error: You must enter a name: ";
getline(cin, nameString);
}
// Get user's title, validate entry.
cout << "Enter your title (Mr., Mrs., Ms., Dr.): ";
getline(cin, titleString);
while (titleString != "Mr." && titleString != "Mrs." && titleString != "Ms." && titleString != "Dr.")
{
cout << endl << endl << "Error: A proper title is required (Mr., Mrs., Ms., Dr.): ";
getline(cin, titleString);
}
// Get user's SSN, validate for correct format.
cout << "Enter your SSN (XXX-XX-XXXX): ";
getline(cin, ssnString);
bool validssn; // Used for loop.
do
{
// Re-Set value at start of each loop.
validssn = true;
// Check SSN entry for correct length.
if (ssnString.length() != 11)
{
validssn = false;
}
// Check that - are in the correct location.
if ((ssnString[3] != '-') || (ssnString[6] != '-'))
{
validssn = false;
}
// Check that all other elements of the array are digits.
if (((isdigit(ssnString[0])) || (isdigit(ssnString[1])) || (isdigit(ssnString[2])) || (isdigit(ssnString[4]))
|| (isdigit(ssnString[5])) || (isdigit(ssnString[7])) || (isdigit(ssnString[8])) || (isdigit(ssnString[9]))
|| (isdigit(ssnString[10]))) == 0)
{
validssn = false;
}
// If any of the above are incorrect, display error message, get new entry from user.
if (validssn == false)
{
cout << "Error: You must enter a SSN in the correct format: ";
getline(cin, ssnString);
}
} while (validssn == false); // Exit loop if SSN value is good.
// Get user's account number, validate for null entry.
cout << "Enter your account ID: ";
getline(cin, accountString);
while (accountString == "")
{
cout << endl << "Error: You must enter a name: ";
getline(cin, accountString);
}
// Personalized welcome message.
cout << endl << endl;
countString = "How are you " + titleString + " " + nameString + "?";
centerString(countString);
cout << endl;
countString = "Press <Enter> for our banking services....";
centerString(countString);
cout << endl << endl;
cin.get();
system("cls");
// Instance of class Account to hold strings that other classes will inherit.
Account accountObject(nameString, titleString, ssnString, accountString);
}