Вектор C становится пустым в классе экземпляра после ввода некоторых данных

#c #oop #vector

#c #ооп #вектор

Вопрос:

 class Bank {
  private:
   string bankName;
   vector<Account> accounts;

  public:
   Bank(string name){
    bankName = name;
   }
   Account registerAccount(string name){
    Account account(name, rand());
    accounts.push_back(account);

    return account;
   }
  void checkMyAccount(Account account){
    cout << accounts.size();
    cout << bankName;
    for(Account acc : accounts){
      if(acc.getBankId() == account.getBankId()){
        cout << acc.getName();
      }
    }
  }
};
  

Я новичок в c , и знаете ли вы, почему в другом методе мой вектор становится пустым после нажатия некоторых данных? это полный код https://repl.it/@mufti1/CircularFrontSigns

Комментарии:

1. Какой другой метод? Где ваш тестовый код?

2. как вы используете класс????

3. Определение Account и main функции отсутствуют. Пожалуйста, добавьте их также в вопрос

4. В опубликованном вами коде нет ничего плохого. Ошибка в коде, который вы не опубликовали. Вероятно, проблема в том, что ваш код ссылается на два разных Bank объекта, когда вы думаете, что существует только один Bank объект.

5. У меня есть класс Account, но я забыл добавить здесь, и здесь в main int main() { string name; cout << «введите свое имя: «; cin >> name; customer cust (имя); Bank bank («BCA»); Учетная запись customerAccount = cust.requestAccount(bank); bank.checkMyAccount(customerAccount); }

Ответ №1:

Итак, проблема в том, что у вас есть два разных объекта банка

 Bank bank("BCA");
Account customerAccount = cust.requestAccount(bank);

Account requestAccount(Bank bank){
  return bank.registerAccount(name);
}
  

Объект bank в requestAccount является копией объекта bank в main . Таким образом, вы добавляете учетную запись к копии, но не к оригиналу в main.

Для решения используйте ссылку

 Account requestAccount(Bankamp; bank){
  return bank.registerAccount(name);
}
  

При использовании ссылки Bankamp; объект bank не копируется, и ваш код изменяет объект Bank в main вместо локальной копии.

По какой-то причине новички часто предполагают, что C по умолчанию передает объекты по ссылке. Но это не тот случай, если вам нужна ссылка, вы должны запросить ее.

Ответ №2:

Ваша проблема здесь:

 Account requestAccount(Bank bank)  //<--- you are passing by value
{
    return bank.registerAccount(name);
}
  

При вызове requestAccount(bank) создается копия исходного Bank объекта:

   Account customerAccount = cust.requestAccount(bank);
  

Чтобы исправить это, измените функцию на:

 Account requestAccount(Bankamp; bank) {   //pass by reference
...
}
  

Ответ №3:

Проблема в коде, который вы не показали в сообщении: ваш requestAccount метод принимает Bank объект путем копирования, а не по ссылке. Вы должны удалить Bank конструктор копирования (или сделать его закрытым), чтобы предотвратить повторение подобных вещей.