2013-07-30 2 views
0

Я хочу, чтобы эта функция использовалась для циклов для итерации по моим двум векторам (структур), добавляя баланс каждого объекта в самой внутренней структуре к переменной " банковский баланс".C++ Для циклов через векторы структур (содержащий больше векторов структур)

Я не уверен, как правильно петлять эту систему для достижения этой цели. Думаю, у меня проблема с моим синтаксисом, где я пытаюсь вызвать вектор внутри структуры.

Я действительно не знаю, как отформатировать эту секунду для цикла. Любые советы были бы очень благодарны, я пробовал каждую комбинацию вещей, о которых я могу думать, и все, что я видел в Интернете.

+1

Зачем хранить указатели в векторах? Вы просто выбросили RAII из окна ... – Borgleader

ответ

1

В C++ не требуется typedef при объявлении структуры. Внутри структуры объявите учетную запись после typedef. 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 (auto user : users) 
{ 
    for (auto account : user.accounts) 
    { 
     bankBalance = bankBalance + account->balance; 
    } 
} 
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 игнорируется. Это просто добавляет беспорядок в код.

Наконец, на первый взгляд кажется, что нет смысла использовать указатели в вашем коде. Это было бы значительно упрощено, если бы вы сохранили значения.

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" к вашему structs, он не будет виден внутри этой функции.
  4. Вы не освоили объявление типа объявления vs member в C++.

"typedef" определяет тип. Таким образом, вам не нужно это infront «struct» или «class», и вы определенно не хотите его при объявлении переменных.

Для вашего собственного здравомыслия, подумайте о том, чтобы сделать имена переменных-членов отличными от других переменных, а имена класса/структуры различны.Общей практикой является использование «m_» в качестве префикса для «члена», верхнего верблюда для классов, «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; 
} 
+0

Спасибо всем за ваши ответы, я сделал ваши предложенные изменения, и он работает красиво. Я отвечу, как только буду отвечать требованиям. – Wenzel745

Смежные вопросы