Although, I have been looking for hours in my program for memory management mistakes, without finding any, I keep getting the "access violation" error. According to the debugging, it seems to occur at an it++ line. Let me post you the whole code. If you gave me your lights, it would be highly appreciated.
Code:
//metro.h
#define totalWaggons 10
#define maxCapacity 40
using namespace std;
#include <list>
class train{
public:
train(int);
~train(void);
void printStatistics(void);
void operate();
void income(int);
private:
int money;
int stations;
};
class passenger{
public:
passenger(int, int);
int have_ticket();
int may_discount();
private:
int ticket;
int discount;
};
class waggon{
public:
waggon();
~waggon();
void embark(int);
void disembark(int);
void inStation();
void betweenStations();
void printStatistics(void);
private:
int offenders;
int escapers;
int passengers;
list<class passenger *> passlist;
};
Code:
//metro.cpp
#include "metro.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
train *T;
train::train(int s){
cout << "A metro train with " << totalWaggons << " waggons, was created" << endl;
stations = s;
money=0;
}
train::~train(){
cout << "A metro train was destroyed" << endl;
}
void train::operate(void){
waggon* w;
w = new waggon[totalWaggons];
for(int i=0; i<stations; i++){
for(int j=0; j<totalWaggons; j++){
w[j].inStation();
if(rand()%2)
w[j].betweenStations();
w[j].printStatistics();
}
printStatistics();
}
delete[] w;
}
void train::income(int amount){
money += amount;
}
waggon::waggon(void){
cout << "A waggon with capacity for " << maxCapacity << " passengers, was created" << endl;
passengers=offenders=escapers=0;
}
waggon::~waggon(void){
cout << "A waggon was destroyed" << endl;
}
void waggon::printStatistics(void){
cout << offenders << " passengers were found to offend" << endl;
cout << escapers << " without ticket were not caught" << endl;
}
void train::printStatistics(void){
cout << money << " euros were collected" << endl;
}
void waggon::disembark(int n){
list<passenger *>::iterator it;
for(it=passlist.begin(); n>1; n--)
it++;
passlist.erase(it);
}
void waggon::embark(int n){
list<passenger *>::iterator it;
passenger *p;
p = new passenger(rand()%2, rand()%2);
if(!p->have_ticket())
escapers++;
else{
if(p->may_discount()) T->income(1);
else T->income(2);}
for(it=passlist.begin(); n>1; n--)
it++;
passlist.insert(it, p);
}
void waggon::inStation(){
int in, out, i, rnd;
if(passengers){
out = rand() % passengers + 1;
for(i=0; i<out; i++){
rnd = rand() % passengers +1;
disembark(rnd);
passengers--;
}
}
in = rand() % (maxCapacity-passengers) + 1;
if(passengers==0){
embark(1);
passengers++; in--;
}
for(i=0; i<in; i++){
rnd = rand() % passengers +1;
embark(rnd);
passengers++;
}
}
void waggon::betweenStations(){
list< passenger *>::iterator it;
it=passlist.begin();
while(it!=passlist.end()){
if((*it)->have_ticket() == 0){
offenders++;
escapers--;
if((*it)->may_discount())
T->income(30);
else
T->income(60);
it = passlist.erase(it);
}
else
it++;
}
}
passenger::passenger(int tick, int disc){
ticket = tick;
disc = discount;
}
int passenger::have_ticket(){
return ticket;
}
int passenger::may_discount(){
return discount;
}
int main(int argc, char *argv[]){
int stations;
if(argc>1){
srand(time(NULL));
stations = atoi(argv[1]);
if(stations>0){
T = new train(stations);
T->operate();
}
}
else
cout << "Please define number of stations" << endl;
system("pause");
}