[英]Is someone capable of spotting what I am doing wrong with this c++ code?
So I'm breaking my head here.所以我在这里打破了我的头。 I've been reading up and down and I just can't figure out why my program crashes once I reach the setLoan function inside of the for loop in main.
我一直在上下阅读,但我无法弄清楚为什么一旦我到达 main 中 for 循环内的 setLoan 函数,我的程序就会崩溃。 AM I missing something, or did I implement the pointer wrong?
我错过了什么,还是我错误地实现了指针? Thanks in advanced.
提前致谢。
#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;
}
What you are doing wrong is you are trying to access a dynamic array of size zero when you call Car::setLoan
for pCar2
.你做错了什么,当你为
pCar2
调用Car::setLoan
时,你试图访问一个大小为零的动态数组。
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
}
When you first try to allocate memory for pLoan
in the constructor of the second car(car2), the size of nbrOfLoans
is 0, so your pointer is not pointing to anything.当您第一次尝试为分配内存
pLoan
于2号车(CAR2)的构造,大小nbrOfLoans
是0,所以你的指针没有任何东西。 Later you tried to access it by calling pCar2->setLoan(bank, loan, i);
后来你尝试通过调用
pCar2->setLoan(bank, loan, i);
来访问它pCar2->setLoan(bank, loan, i);
. .
It would be better if you could use std::vector
otherwise you need to create/resize your dynamic array after you know the size that it should hold,ie after getting the value of nbrOfLoans
at Car::setNbrOfLoans
.如果您可以使用
std::vector
会更好,否则您需要在知道它应该容纳的大小后创建/调整动态数组的大小,即在Car::setNbrOfLoans
获取nbrOfLoans
的值之后。
void Car::setNbrOfLoans(int a) {
nbrOfLoans = a;
if(pLoan!=NULL)
delete[] pLoan;
pLoan = new Loan[nbrOfLoans];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.