**** Désolé pour la confusion concernant numCars dans la publication d'origine. J'ai modifié le code pour être cohérent avec l'original ******Violation d'accès au tableau dynamique C++
Le programme académique suivant est une version simplifiée du problème original mais il se concentre sur le problème que je n'ai pas encore résolu. Il y a 2 classes et une méthode principale à ce problème et les 2 classes se composent d'une classe de revendeur et d'une classe de voiture. La classe Dealer a un pointeur Car * privé initialisé sur un tableau dynamique dans le constructeur du Dealer. L'erreur se produit dans la méthode principale lorsque la méthode addCar du revendeur est appelée. Dans la méthode principale, je passe intentionnellement la variable Dealer à la méthode addCar (Dealer & d) pour imiter la structure de l'application d'origine. La méthode addCar appelle ensuite la méthode addCar du concessionnaire (const Car & car) où la violation d'accès se produit lorsque j'exécute des voitures [numCars ++] = car; Pouvez-vous expliquer pourquoi les voitures [numCars ++] = résultats de voiture dans une violation d'accès
/**********************************Dealer.h**************************/
#include <cstdlib>
#include "Car.h"
using namespace std;
class Dealer
{
public:
Dealer(int maxCars = DEFAULT_MAX_CARS)
: numCars (0) {voitures = new voiture [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 (int count) {numCars = count;}
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;
}
Vous me battre de 10 secondes :( – GManNickG
vous avez raison de ne pas l'initialisation numCars mais il a été initialisé dans le code original et je reçois toujours l'erreur de violation d'accès si je change les voitures. [numCars ++] = voiture aux voitures [0 | 1 | 2 | 3 | ...] = voiture; –
J'ai modifié la signature d'addCars pour m'attendre à ce qu'un revendeur * évite de créer une nouvelle instance d'un concessionnaire mais n'a pas résolu l'accès Erreur de violation La réinitialisation de d dans la méthode addCar m'a paru suspicieuse aussi mais la changer n'a eu aucun effet –