c++如何声明在多个函数中使用的类实例
C++ How to Declare a Class Instance to be used in multiple functions
我在一个项目中遇到了一个问题,我想知道我是否应该从一开始就设计一些不同的东西。
目标是设计一个菜单驱动的银行项目,它必须使用带有继承和虚函数的类。父类是"Account",有两个子类"Checking"answers"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);
}
一般来说,如果你将不同的任务封装在不同的类中,并通过构造函数传递它们可能需要修改的任何对象,你可以避免使用单例和全局函数。这也将帮助你进行测试,因为你可以传递虚拟对象,例如,DummyChecking到handler:
int main() {
Checking checking();
Savings savings();
MenuHandler handler(checking, savings);
handler.handle_events();
return 0;
}
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 如何使用非默认构造函数实例化模板化类
- C++ - 使用另一个类的构造函数实例化一个对象
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 与参数匹配的友元模板函数实例化
- c++如何获取模板函数实例的地址
- 在保证复制的世界中构造函数实例化
- SFINAE 和模板函数实例化:为什么在启用了 SFINAE 类型的函数参数中使用模板参数时无法推断模板参数?
- 防止复制构造函数实例化 C++11 类"deleting"
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 没有 std::string .erase() 的重载函数实例
- C 矢量构造函数实例冲突
- 确保只有一个函数实例在运行?
- 使用不同类型的模板函数实例化
- C 调用模板构造函数实例化
- 没有与参数列表错误匹配的重载函数" "实例
- 为什么很清楚模板函数实例化不会内联
- 没有unordered_map的模板函数实例
- 模板函数实例化文件
- 模板函数实例化的可移植性问题