【问题标题】:I am trying to use classes in C++我正在尝试在 C++ 中使用类
【发布时间】:2020-01-04 12:01:31
【问题描述】:

我正在做一个我认为需要使用类的项目。我想创建一个银行系统,为此我需要创建由密码和名称组成的帐户。问题是当我尝试创建一个新帐户时,以前的帐户会被删除,因此我一次只能拥有一个帐户。 我在互联网上进行了研究,我认为解决方案是使用类。有人可以帮助我提供建议或想法吗?下面我附上代码。

The function Main

在 Input.txt 文件中,我添加初始 1,然后随着每个帐户的创建增加变量 cont。问题是文件 Conturi.txt,因为我只有一个帐户,最新的一个,我不知道为什么,因为每次我使用 void creare_cont....

【问题讨论】:

  • 请将代码直接发布到您的问题中,而不是屏幕截图中。您可以使用 ctrl+k 使突出显示的文本显示为代码

标签: c++ file class


【解决方案1】:

首先请格式化您的代码。并将其附加到您的问题中。

要编写银行系统,您显然可以使用类。但这里不是这样。 您的问题不在于类,而在于应用程序的逻辑。很难准确说出您的代码应该做什么,因为它不完整,而且我不熟悉罗马尼亚语,但我会尝试猜测。

当你尝试编写这样一个项目时,你首先要问自己几个问题:

  • 银行系统是做什么的?
  • 它应该具备哪些功能?
  • 它存储什么样的数据?
  • 这些数据将如何存储?

我想我们都知道第一个问题的答案:它可以让客户赚钱。那很简单。 根据公布的代码,我会尝试回答剩下的问题。

它应该具备哪些功能?

我将您的菜单翻译成这样:

  1. 创建一个新的银行帐户。
  2. 登录现有帐户。
  3. 显示现有帐户的余额。

它存储什么样的数据?

让我们保持简单,只存储用户名、密码和用户余额。为此,我们将创建自己的structure。我们可以使用类,但正如我所说:保持简单和简短。

struct BankAccount
{
  std::string username;
  std::string password;
  int balance;
};

这些数据将如何存储?

为了存储一些数据,我们通常使用某种数据库。我会像你一样使用一个简单的文件。但首先我们必须决定如何在我们的数据库中存储帐户?我再次建议保持简单并制定一些规则:

  • 用户名和密码不能包含任何空格
  • 密码将以纯文本形式存储
  • 余额必须适合int
  • 所有内容都将用空格隔开

我会再添加一条规则(以使其在调试时更具可读性):每个用户都将被保留在不同的行中。所以我们的数据库可能是这样的:

adam pass 123
eva qwerty 666
henry qaz123 -100
... and so on ...

回答完所有问题后,我们可以开始思考我们的系统应该如何工作?

它应该如何工作?

我会将我们的逻辑分为 4 个步骤:

  1. 加载数据库。
  2. 询问用户该怎么做。
  3. 做任何用户要求的事情。
  4. 保存数据库。

当然,这不是最好或最快的方法。但正如我所说:保持简单。我们还将假设数据库没有损坏,因此我们不必在加载时对其进行验证。

现在让我们将每个步骤分成原子。

1。加载数据库。

为此,我们需要一个包含数据的文件和某种结构来加载数据。我们将使用std::vector,因为它可以自动扩展,我们不必担心它。现在,我们需要做什么?我们确切地知道我们的文件的结构,我们可以假设数据库没有损坏。所以我们需要做的就是读取字符,直到遇到空格。幸运的是,我们可以在不编写任何复杂函数的情况下做到这一点。标准库会为我们做这件事:

#include <vector>
#include <string>
#include <fstream>

std::vector<BankAccount> LoadDatabase(const std::string &dbFile)
{
  std::vector<BankAccount> accounts;
  std::ifstream file(dbFile);

  if (!file)
  {
    std::cerr << "Cannot open database file!" << std::endl;
    return accounts;
  }

  BankAccount account;
  while (file >> account.username >> account.password >> account.balance)
    accounts.push_back(account);

  return accounts;
}

因为我们数据库中的每个字段都由空格分隔,所以我们可以轻松读取整个文件。我将把SaveDatabase(const std::string &amp;dbFile, const std::vector&lt;BankAccount&gt; &amp;accounts) 的实现留给你。它应该和我们的加载函数非常相似。

2。询问用户该怎么做。

我也不会写这段代码。你已经这样做了。我能做的是建议您将其移至单独的函数中并返回结果(请求的操作)。您应该不断询问用户的输入,直到它有效为止(即它是一个整数并且对应于菜单中的任何元素)。

3。做任何用户要求的事情。

现在我们应该根据用户在上一步中选择的内容调用适当的函数。我们将使用switch statement。我翻译了(如果有任何问题都怪 Ggoogle)你的菜单,以了解我们必须实现什么样的功能,我以这三个结束:

  • 创建一个新的银行帐户。
  • 登录现有帐户。
  • 显示现有帐户的余额。

创建一个新帐户应该很容易。我们已经在std::vector 中加载了我们的数据库,并且我们知道在关闭应用程序时它将被保存回文件中。我们所要做的就是请求新的用户数据(用户名和密码),构建一个新对象并将其添加到std::vector。它可能看起来像这样:

void CreateAccount(std::vector<BankAccount> &accounts)
{
  BankAccount account;

  std::cout << "Provide username and password (separated by space):" << std::endl;
  std::cin >> account.username >> account.password.
  account.balance = 0;
  accounts.push_back(account);
}

我不知道登录到现有帐户应该做什么(也许显示一个新菜单?),所以我会留给你写。但是显示所有帐户的余额应该很容易:

void DisplayAllAccounts(const std::vector<BankAccount> &accounts)
{
  std::cout << "All accounts in database:\n";
  for (size_t i = 0; i < accounts.size(); ++i)
    std::cout << "\t" << accounts[i].username << " has $" << accounts[i].balance << "\n";
}

4。保存数据库。

正如我所说,我将把它留给你。根据你现在的情况,应该不会那么难写。

哦,我会忘记的。您的 main 函数与 switch 语句:

int main()
{
  const std::string dbFile = "Conturi.txt";

  // Load the database
  std::vector<BankAccount> accounts = LoadDatabase(dbFile);

  // SelectAction shows the menu, gathers user's input and return 1, 2 or 3 depending on action he choosed
  switch(SelectAction())
  {
    case 1:
      CreateNewAccount(accounts);
      break;
    case 2:
      LogIntoAccount(accounts);
      break;
    case 3:
      DisplayAllBalances(accounts);
      break;
    default:
      // This should never happend because SelectAction should handle incorrect input
      std::cerr << "Incorrect input!" << std::endl;
      return 1;
  }

  // Save the database
  SaveDatabase(dbFile, accounts);
  return 0;
}

如您所见,这并不难。如果格式正确,代码可读性更高。

现在我已经完成了你的大部分作业,祝你好运!

【讨论】:

  • 你为什么使用 std::cerr 而不是简单的 cout?无论如何,您对我帮助很大,谢谢您,大师。
  • std::cerr 被指定用于错误输出。在这里阅读更多:en.cppreference.com/w/cpp/io/cerr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2012-08-02
  • 1970-01-01
  • 2018-11-15
  • 2022-08-21
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多