0

この関数で for ループを使用して (構造体の) 2 つのベクトルを反復処理し、最も内側の構造体の各オブジェクトの残高を変数 "銀行残高" に追加します。

これを達成するために、このシステムを適切にループする方法がわかりません。構文に問題があると思います。構造体内でベクトルを呼び出そうとしています。

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ループをフォーマットする方法が本当にわかりません。どんなヒントでも大歓迎です。考えられるすべての組み合わせと、Web で見たすべてのものを試しました。

4

3 に答える 3

1

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;
};

ループ内で、アカウント (オブジェクト タイプ) をアカウント (オブジェクト自体) に変更します。既にポインター型であるため、アイテムを参照する必要もありません。(とにかくアドレスをコピーしているだけです)。

内側のループでは、ユーザーに直接アクセスします。これは、 for の範囲によって index のオブジェクトに直接アクセスできるためです。

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」は型を定義します。したがって、「構造体」または「クラス」の前にそれを必要とせず、変数を宣言するときに絶対に必要ありません。

あなた自身の正気のために、メンバー変数名を他の変数と区別し、クラス/構造体名を区別することを検討してください。一般的な方法は、"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 に答える