我遇到了一个项目的问题,并想知道我是否应该从一开始就设计出不同的东西。
目标是设计一个菜单驱动的银行项目,该项目必须使用具有继承和虚函数的类。父类是'帐户',有两个孩子'检查'和'储蓄'。
我已经通过将菜单设计为从main调用的函数来启动项目,然后从sub-meun函数中调用类的相应虚拟成员函数。我遇到的问题是每个类的实例只能从创建它的函数中访问。
我知道把它们放在一个标题中,因为全局不是最常被接受的处理事物的方式,我读过关于Singletons的内容,但我的问题是解决这个问题的正确方法,或者我刚刚接近问题不正确开始?本网站和其他网站上的许多评论似乎表明,如果您需要这些,那么您设计的课程是错误的。
下面的代码展示了我到目前为止所展示的一些内容。我计划为其他菜单选项构建更多功能,但他们都需要访问类的实例。
#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);
}
答案 0 :(得分:0)
通常,如果将不同的任务封装在不同的类中并传递任何可能需要通过构造函数修改的对象,则可以避免使用单例和全局变量。这也将帮助您进行测试,因为您可以传递虚拟对象,例如,DummyChecking到处理程序:
int main() {
Checking checking();
Savings savings();
MenuHandler handler(checking, savings);
handler.handle_events();
return 0;
}