****對不起原始文章中有關numCars的混淆。我修改了代碼以與原始代碼保持一致C++動態數組訪問衝突
以下學術程序是原始問題的簡化版本,但它着重解決了我尚未解決的問題。這個問題有兩個類和一個主要方法,這兩個類由Dealer類和Car類組成。 Dealer類有一個私人Car *指針,它在Dealer的構造函數中被初始化爲一個動態數組。經銷商的addCar方法被調用時,主方法發生錯誤。 在主要方法中,我故意將Dealer變量傳遞給addCar(Dealer & d)方法來模擬原始應用程序的結構。 addCar方法然後調用經銷商的addCar(const Car & car)方法,當我執行cars [numCars ++] = car;你能解釋爲什麼汽車[numCars ++] =車導致訪問衝突
/**********************************Dealer.h**************************/
#include <cstdlib>
#include "Car.h"
using namespace std;
class Dealer
{
public:
Dealer(int maxCars = DEFAULT_MAX_CARS)
:numCars(0) {汽車=新車[maxCars];}
~Dealer(){delete [] cars;}
int getTotalCars() const { return numCars;}
void addCar(const Car& car)
{
cars[numCars++] = car; // Access Violation
}
Car* begin(){return cars;};
Car* end(){ return cars + numCars;}
setNumCars(詮釋計數) {numCars =計數;}
private:
static const int DEFAULT_MAX_CARS = 10;
Car* cars;
int numCars;
};
/**********************************Car.h**********************/
#include <cstdlib>
#include <string>
using namespace std;
class Car{
public:
Car()
: year(0), make(""), model("")
{}
Car(int year, string make, string model)
: year(year), make(make), model(model)
{}
string getMake() const {return make;}
void setMake(string make){this->make=make;}
string getModel() const {return model;}
void setModel(string model){this->model=model;}
int getYear() const {return year;}
void setYear(int year){this->year=year;}
private:
int year;
string make;
string model;
};
ostream& operator<< (ostream& out, const Car& car)
{
out << car.getYear() << " " << car.getMake() << " " << car.getModel();
return out;
}
/**********************************Main.cpp**********************/
#include <cstdlib>
#include <iostream>
#include "Dealer.h"
using namespace std;
void addCar(Dealer& d);
int main(int argc, char *argv[])
{
Dealer d;
addCar(d);
system("PAUSE");
return EXIT_SUCCESS;
}
void addCar(Dealer& d)
{
d = Dealer();
d.addCar(Car(2007, "Honda", "Civic"));
cout << d.getTotalCars() << " total cars" << endl;
}
你以10秒打我:( – GManNickG 2009-09-22 01:15:42
你是正確的關於不進行初始化numCars,但它是在原來的代碼初始化,我仍然得到訪問衝突錯誤,如果我改變汽車。 [numCars ++] = car to cars [0 | 1 | 2 | 3 | ...] = car; – 2009-09-22 01:16:39
我修改了addCars的簽名,期望Dealer *避免創建經銷商的新實例,但並未解決Access違規錯誤addCar方法中的d的重新初始化對我來說也是可疑的,但改變它沒有效果 – 2009-09-22 01:54:41