2016-04-29 96 views
-3

所以我在這裏打破了我的頭。我一直在閱讀,我只是無法弄清楚爲什麼我的程序崩潰後,我到達main循環中的setLoan函數。 AM我錯過了什麼,或者我是否實施了錯誤的指針?先謝謝了。是否有人能夠發現我在做這個C++代碼的錯誤?

#include <string> 
#include <iostream> 
using namespace std; 

//Vehicle Class 
class Vehicle { 
public: 
    Vehicle(); 
    void setPrice(double a); 
    void setMpg(int a); 
    double getPrice() const; 
    int getMpg() const; 
    void printVehicle() const; 
    Vehicle(double price, int mpg); 
private: 
    double price; 
    int mpg; 
}; 

//Loan Class 
class Loan { 
public: 
    void setBank(string a); 
    void setLoan(double a); 
    string getBank() const; 
    double getLoan() const; 
    void printLoan() const; 
    Loan(string bank = "", double loan = 0); 
private: 
    string bank; 
    double loan; 
}; 

//Car Class 
class Car : public Vehicle { 
public: 
    Car(double price = 0, int mpg = 0, string bank = "", double loan = 0, string name = "", int element = 0); 
    void setName(string a); 
    void setLoan(string b, double l, int element); 
    string getName() const; 
    void printFull() const; 
    void setNbrOfLoans(int a); 
    ~Car(); 
private: 
    string name; 
    Loan* pLoan; 
    int nbrOfLoans; 
}; 

//Main 
int main() { 
    Car car1(24800, 22, "Citi", 21600, "Mustang", 1); 
    Car car2; 
    Car* pCar1 = &car1; 
    Car* pCar2 = &car2; 
    cout << "Enter the price of the car: "; 
    double price; 
    cin >> price; 
    pCar2->setPrice(price); 
    cout << "Enter the mpg: "; 
    int mpg; 
    cin >> mpg; 
    pCar2->setMpg(mpg); 
    cout << "Enter the name of the car: "; 
    string name; 
    cin >> name; 
    pCar2->setName(name); 
    string bank; 
    double loan; 
    int index; 
    cout << "Enter the amount of loans you obtained: "; 
    cin >> index; 
    pCar2->setNbrOfLoans(index); 
    for (int i = 0; i < index; i++) 
    { 
     cout << "Enter the name of bank " << i + 1 << ": "; 
     cin >> bank; 
     cout << "Enter the amount of loan " << i + 1 << ": "; 
     cin >> loan; 
     pCar2->setLoan(bank, loan, i); 
    } 
    cout << endl; 
    pCar1->printFull(); 
    pCar2->printFull(); 
    return 0; 
} 
//////////////////////////////////////////////////////////////////////////////////////// 
//Vehicle class function definitions 
//////////////////////////////////////////////////////////////////////////////////////// 
Vehicle::Vehicle() { 
    price = 0; 
    mpg = 0; 
} 

Vehicle::Vehicle(double price, int mpg) { 
    price = price; 
    mpg = mpg; 
} 

void Vehicle::setPrice(double a) { 
    price = a; 
} 

void Vehicle::setMpg(int a) { 
    mpg = a; 
} 

double Vehicle::getPrice() const { 
    return price; 
} 

int Vehicle::getMpg() const { 
    return mpg; 
} 

void Vehicle::printVehicle() const { 
    cout << "Price: " << price << endl; 
    cout << "MPG: " << mpg << endl; 
} 

//////////////////////////////////////////////////////////////////////////////////////// 
//Loan Class function definitions 
/////////////////////////////////////////////////////////////////////////////////////// 

Loan::Loan(string bank, double loan) { 
    bank = bank; 
    loan = loan; 
} 

void Loan::setBank(string a) { 
    bank = a; 
} 

void Loan::setLoan(double a) { 
    loan = a; 
} 

string Loan::getBank() const { 
    return bank; 
} 

double Loan::getLoan() const { 
    return loan; 
} 
void Loan::printLoan() const { 
    cout << "Bank: " << bank << endl; 
    cout << "Loan: " << loan << endl; 
} 

//////////////////////////////////////////////////////////////////////////////////// 
//Car Class function definitions 
//////////////////////////////////////////////////////////////////////////////////// 
Car::Car(double price, int mpg, string bank, double loan, string name, int element) : Vehicle(price, mpg) 
{ 
    nbrOfLoans = element; 
    Car::name = name; 
    pLoan = new Loan[nbrOfLoans]; 
} 


void Car::setName(string a) { 
    name = a; 
} 

void Car::setLoan(string b, double l, int element) { 
    pLoan[element].setBank(b); 
    cout << " "; 
    pLoan[element].setLoan(l); 
} 

string Car::getName() const { 
    return name; 
} 

void Car::setNbrOfLoans(int a) { 
    nbrOfLoans = a; 
} 

void Car::printFull() const { 
    cout << endl << "Name: " << name << endl; 
    printVehicle(); 
    for (int i = 0; i < nbrOfLoans; i++) 
    { 
     cout << pLoan[i].getBank(); 
     cout << endl; 
     cout << pLoan[i].getLoan(); 
     cout << endl; 
    } 
} 

Car::~Car() { 
    delete[] pLoan; 
} 
+0

該調用的第一件事是'pLoan [0] .setBank(b);'。 'pLoan'是一個指針 - 告訴我,它指向什麼? – immibis

+0

我用它作爲數組?對不起,我們今天幾乎看不到這個概念,我只想試驗它。但我不知道我做錯了什麼。 –

+0

你知道指針的工作原理嗎? – immibis

回答

0

你在做什麼錯的是你想,當你調用Car::setLoanpCar2訪問大小爲0的動態數組。

Car car2;//the nbrOfLoans member is 0 and pLoan is not pointing to anywhere 
.... 
Car* pCar2 = &car2;//the nbrOfLoans member is 0 and pLoan is not pointing to anywhere 
... 
Car::Car(double price, int mpg, string bank, double loan, string name, int element) : Vehicle(price, mpg) 
{ 
    ... 
    pLoan = new Loan[nbrOfLoans];//doesn't create anything if nbrOfLoans is 0, which is the default 
} 

當你第一次嘗試在第二輛車(CAR2)的構造函數pLoan分配內存的nbrOfLoans大小爲0,所以你的指針沒有任何東西。稍後您嘗試通過調用pCar2->setLoan(bank, loan, i);來訪問它。

如果你可以使用std::vector會更好,否則在知道它應該容納的大小後,即在得到nbrOfLoans的值Car::setNbrOfLoans後,你需要創建/調整動態數組的大小。

void Car::setNbrOfLoans(int a) { 
    nbrOfLoans = a; 

    if(pLoan!=NULL) 
    delete[] pLoan; 

    pLoan = new Loan[nbrOfLoans]; 
} 
+0

非常感謝你的解釋。你真的幫助了我。謝謝。 –

+0

@Bradley沒問題。 –

相關問題