0

我希望这个函数使用 for 循环来遍历我的两个向量(结构),将最内层结构中每个对象的余额添加到变量“银行余额”中。

我不确定如何正确循环通过该系统来实现这一点。我认为我的语法有问题,我试图在结构中调用向量。

typedef struct account
{
string transactionLog;
float balance;
string *pOwner;
int accountNumber;
string label;
};

typedef account* pAccount;

typedef struct user
{
string testUsername;
string customerName;
string testPassword;
bool isCustomer;
bool isTeller;
bool isManager;
user(string username, string testpassword, string customerName, bool iscustomer,        bool isteller, bool ismanager)
        : testUsername(username), testPassword(testpassword), customerName(customerName), isCustomer(iscustomer),
    isTeller(isteller), isManager(ismanager) {}
typedef vector<pAccount> Accounts;
};

typedef user* pUser;
typedef vector<pUser> userVector;
userVector users;
int vectorPos;

double checkBankBalance()
{
double bankBalance;
for (auto &item : users)
{
    for (auto &item : users[item].Accounts)
    {
         bankBalance = bankBalance + item->balance;
    }
}

return 0;
}

我真的不知道如何格式化第二个 for 循环。任何提示将不胜感激,我已经尝试了我能想到的每一种组合,以及我在网上看到的所有东西。

4

3 回答 3

1

您的结构不包含 a vector,它只有一个typedef

typedef vector<pAccount> Accounts;

如果您想Accounts成为数据成员,请删除typedef.

vector<pAccount> Accounts;

此外,您应该认真考虑不要为嵌套循环的两个级别中的项目使用相同的名称:

for (auto& user : users)
{
    for (auto& account : user.Accounts)
    {

另外,请注意,您不需要使用typedef来声明结构。在typedef struct Foo {};中,typedef 被忽略。它只是给代码增加了混乱。

最后,乍一看似乎没有理由在代码中使用指针。如果您改为存储值,它将大大简化。

于 2013-07-30T03:55:25.067 回答
1

在 c++ 中,声明结构时不需要 typedef。在 struct 中,在 typedef 之后声明 Account。Typedef 没有声明。

struct user
{
    string testUsername;
    string customerName;
    string testPassword;
    bool isCustomer;
    bool isTeller;
    bool isManager;
    user(string username, string testpassword, string customerName, bool iscustomer,        bool isteller, bool ismanager)
        : testUsername(username), testPassword(testpassword), customerName(customerName), isCustomer(iscustomer),
    isTeller(isteller), isManager(ismanager) {}
    typedef vector<pAccount> Accounts;
    Accounts accounts;
};

在循环中,将 Account(对象类型)更改为 account(对象本身)。也不需要引用该项目,因为它已经是指针类型。(无论如何,您只是在复制地址)。

在内部循环中,直接访问用户,因为范围 for 使您可以直接访问索引处的对象。

for (auto user : users)
{
    for (auto account : user.accounts)
    {
         bankBalance = bankBalance + account->balance;
    }
}
于 2013-07-30T04:40:16.207 回答
0
double checkBankBalance()
{
double bankBalance;
for (auto &item : users)
{
    for (auto &item : users[item].Accounts)
    {
         bankBalance = bankBalance + item->balance;
    }
}

return 0;
}
  1. 你没有初始化“bankBalance”,
  2. 您没有归还(或使用)bankBalance,
  3. 当您将成员变量“bankBalance”添加到您的结构时,它将在此函数中不可见。
  4. 您还没有掌握 C++ 中的类型声明与成员声明。

“typedef”定义了一个类型。所以你不需要它在“struct”或“class”前面,而且在声明变量时你绝对不想要它。

为了您自己的理智,请考虑使成员变量名称与其他变量不同,并使类/结构名称不同。一种常见的做法是使用“m_”作为“member”的前缀,类的大写字母,“s_”代表静态,“g_”代表全局。

struct Account /* Capitalize struct/class names */
{
    string m_transactionLog;
    float m_balance;
    string *m_pOwner; // I've got a bad feeling about this.
    int m_accountNumber;
    string m_label;
};

当您执行以下操作时,您将遇到解决方案:

typedef struct User /* capitalize class names */
{
    string m_testUsername;
    //...

    user(const string& username, const string& password, const string& customerName, bool isCustomer, bool isTelelr, bool isManager)
        : m_testUsername(username), m_testPassword(password)
        , m_customerName(customerName /* ouch, this was broken before*/)
        , isCustomer(isCustomer)
        , isTeller(isTeller)
        , isManager(isManager)
    {}
    ...
    // Look ma: a type definition
    //typedef vector<pAccount> Accounts;
    // Well, ma, we actually wanted a member, not a type.
    vector<pAccount> m_accounts; // Ok, pointers to accounts, I have a bad feeling again.
};

现在 checkBankBalance 变得相当直观。

double checkBankBalance()
{
    double bankBalance = 0; // local and farm bought.

    for (auto &user: g_users) // everything in users.
    {
        // now we want to iterate over the accounts member of the user.
        // which will be 'm_accounts'. Since it's a pointer, don't use &
        for (auto item : user.m_accounts)
        {
             bankBalance = bankBalance + item->balance;
        }
    }

    /// do something with bankBalance here
    /// ...
    ///

    return 0;
}
于 2013-07-30T06:11:37.480 回答