c++如何声明在多个函数中使用的类实例

C++ How to Declare a Class Instance to be used in multiple functions

本文关键字:函数 实例 何声明 声明 c++      更新时间:2023-10-16

我在一个项目中遇到了一个问题,我想知道我是否应该从一开始就设计一些不同的东西。

目标是设计一个菜单驱动的银行项目,它必须使用带有继承和虚函数的类。父类是"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;
}