2016-01-29 5 views
0

im новое для изучения C++ и iam теперь в стадии создания класса, содержащего вектор объекта класса, с методами добавления новых объектов и вывода их на печать.Как объявить векторный объект в C++?

Вот мой код до сих пор:

BankAccount.h:

#ifndef BANKACCOUNT_H 
#define BANKACCOUNT_H 
#include <string> 
using namespace std; 

class BankAccount 
{ 
    public: 
     BankAccount(string C_Name,int C_Balance); 
     /* 
     void SetCustomerName(string C_Name); 
     String GetCustomerName(); 
     void SetCustomerBalance(int C_Balance); 
     int GetCustomerBalance(); 
     */ 
     int deposit(int deposit_); 
     int withdraw(int withdraw_); 
    private: 
     string customer_name; 
     int customer_balance = 0; 
     int Deposit = 0; 
     int Withdraw = 0; 

}; 

#endif // BANKACCOUNT_H 

BankAccount.cpp:

BankAccount::BankAccount(string C_Name,int C_Balance) 
{ 
    customer_name = C_Name; 
    customer_balance = C_Balance; 
} 


int BankAccount :: deposit(int deposit_){ 

     Deposit = deposit_; 
     Deposit = Deposit + customer_balance; 
     cout << "\nDeposit Balance = " << Deposit; 
     customer_balance = Deposit; 
     return customer_balance; 

    } 
int BankAccount :: withdraw(int withdraw_){ 
     Withdraw = withdraw_; 
     Withdraw = customer_balance - Withdraw; 
     customer_balance = Withdraw; 
     cout<<"After Withdraw Balance is "<<customer_balance; 
     return customer_balance; 
} 

Bank.h

#ifndef BANK_H 
#define BANK_H 
#include <vector> 
#include "BankAccount.h" 
using namespace std; 


class Bank 
{ 
    public: 
     //variables , lists 
     vector<BankAccount> newAccount; 
     BankAccount bk; 

     // constructor 
     Bank(); 

}; 

#endif // BANK_H 

Bank.cpp:

#include "Bank.h" 
#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

Bank :: Bank() 
{ 
    string Customer_name = " "; 
    int Customer_balance = 0; 

    cout << "Add name please "; 
    cin >> Customer_name ; 

    cout << "How much balance?"; 
    cin >> Customer_balance; 

newAccount.push_back(bk(Customer_name,Customer_balance)); 


} 

Класс BankAccount прекрасно, основная проблема заключается в классе банка.

Я создал класс банка для создания векторов BankAccount с методами, которые добавляют все BankAccount и распечатывают их все.

Однако эта ошибка продолжает появляться под конструктору Bank.cpp:

error: no matching function for call to 'BankAccount::BankAccount()' 

кажется, что всякий раз, когда им пытаются объявить объект класса внутри вектора BankAccount, ошибка продолжает occuring.Can кто-то пожалуйста, объясните что я делаю неправильно и как это исправить?

ответ

0

Вы просто забыли реализовать конструктор своего класса BankAccount.

BankAccount::BankAccount(string C_Name,int C_Balance) 
    : customer_name(C_name) 
    , customer_balance(C_Balance) 
{ 
    // TODO; 
} 

Как примечание стороны, вы, вероятно, хотите вы входной параметр C_name быть const std::string& cName (с использованием верблюжьего быть последовательным, поэтому переменная никогда не должна начинаться с заглавной буквы, он используется только для классов и структур).

Обычно для частных лиц мы используем variable_ (вы сделали обратное). Другой совет, переменные должны быть инициализированы из тела конструктора.

EDIT:

// This is wrong 
newAccount.push_back(bk(Customer_name,Customer_balance)); 

Оно должно быть:

// Construct a valid BankAccount object using it's constructor to fill the vector 
newAccount.push_back(BankAccount(Customer_name, Customer_balance)); 

Переменная bk бесполезно и нуждается в конструктор по умолчанию BankAccount::BankAccount() отсюда и ошибки.

+0

Ой, я забыл вставить это, спасибо за то, что, хотя я все равно получаю ту же ошибку –

0

Кажется, что нет стандартного конструктора BankAccount::BankAccount(), определенного в вашем BankAccount.h.

Но когда вы объявляете стандартный конструктор, то вы бежите в следующей ошибки

Ошибка 1 Ошибка LNK2019: неразрешенный внешний символ «общественности: __thiscall BankAccount :: BankAccount (аннулируются)» (??0BankAccount @@ QAE @ XZ) ссылка в функции "общественность: __thiscall Банк :: Банк (аннулируется)" (?? 0Bank @@ QAE @ XZ) [...]

означает, что переменная член Bank::bk объявлен, но никогда не было определено.

Чтобы скомпилировать код успешно, я рекомендую удалить декларацию переменной-члена bk в классе Bank. Это не имеет никакого смысла. Затем выполните следующие действия в своем классе Bank.

Bank::Bank() 
{ 
    string Customer_name = " "; 
    int Customer_balance = 0; 

    cout << "Add name please "; 
    cin >> Customer_name; 

    cout << "How much balance?"; 
    cin >> Customer_balance; 

    BankAccount bankAccount(Customer_name, Customer_balance); 
    newAccount.push_back(bankAccount); 
} 

Вы убедитесь, что успешно вектор newAccount наполняются новым объектом BankAccount.

0

Вы не определили конструктор по умолчанию. Когда вы используете push_back, он попытается по умолчанию построить объект, а затем скопировать тот, который вы передаете. Вы также по умолчанию строите член bk в банке. У вас есть 2 варианта решения этой проблемы.

  1. Определите конструктор по умолчанию, т.е. BankAccount() {
  2. Если вы находитесь в C++ 11, вы можете использовать векторы emplace_back. Вам нужно будет провести редизайн, чтобы удалить участника из банка.
3

Проблема не имеет std::vector от BankAccounts. Проблема в том, что ваш класс Bank имеет определенный член данных: BankAccount bk; Поскольку у вас нет явных аргументов конструктора, он пытается использовать конструктор по умолчанию BankAccount(). Объявление конструктора объявлено не будет, поэтому вы получите ошибку компиляции.

Я подозреваю, что вам действительно не нужен этот элемент данных bk, и его следует, вероятно, просто удалить.

Следующая проблема, когда вы пытаетесь выполнить push_back, вы вызываете объект bk вместо создания объекта. То, что вы хотите, чтобы просто

Если вы используете C++11 или больше (который он выглядит, как вы), вы можете использовать emplace_back вместо

newAccount.emplace_back(Customer_name,Customer_balance); 

Это оставит свой класс банковского счета следующим образом:

class Bank { 
    public: 
    std::vector<BankAccount> newAccount; 
    Bank(); 
}; 

Bank::Bank() { 
    std::string Customer_name = " "; 
    int Customer_balance = 0; 

    std::cout << "Add name please "; 
    std::cin >> Customer_name ; 

    std::cout << "How much balance?"; 
    std::cin >> Customer_balance; 

    newAccount.emplace_back(Customer_name,Customer_balance); 
} 
0

Все объекты, содержащиеся классом построены , прежде чем тело конструктора. В этом случае ваш Bank объект непосредственно содержит BankAccount объект, bk, который построен до открытия { в вашем Bank конструктору:

Bank :: Bank() 
// ... bk is initialized here.... 
{ 

Вы попытку дать bk некоторые аргументы позже, в вызове newAccount.push_back , но уже слишком поздно; объект инициализирован bk.

Для управления как объекты инициализируются в конструкторе, вы должны поместить вызовы их конструкторами в списке инициализации:

Bank :: Bank() 
    : bk(Customer_name,Customer_balance) 
{ 

... но, конечно, вы еще не определили Customer_name или Customer_balance.

Так давайте вернемся немного: почему вы толкая счет в ваш Bank при инициализации Bank? Почему учетная запись даже существует на данный момент? Почему Bank имеет bk в качестве участника? (Почему эта учетная запись обрабатывается специально, когда есть целые vector учетных записей, которые также содержатся в файле Bank?) И как вы собираетесь добавлять дополнительные аккаунты позже?

Итак, попробуйте это: во-первых, по умолчанию инициализировать Bank:

Bank :: Bank() {} 

... или, в заголовке (если вы используете C++ 11 или C++ 14, которые вам должно быть):

Bank(void) =default; 

Затем добавить метод для добавления учетных записей:

Bank::addAcount(void) 
{ 
    // ... use stdin/stdout to get `customer_name` and `customer_balance`... 
    newAccount.emplace_back(customer_name,customer_balance); 
} 

(Обратите внимание, что вам нужно добавить push_back вместо emplace_back, если вы не используете C++ 11 или C++ 14.)

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