Changeset - r7412:e5f07529a093
[Not reviewed]
master
0 6 0
rubidium - 17 years ago 2007-08-05 17:43:04
rubidium@openttd.org
(svn r10798) -Fix [FS#1105]: virtual functions do not work in destructors :(.
6 files changed with 17 insertions and 11 deletions:
0 comments (0 inline, 0 general)
src/aircraft.h
Show inline comments
 
@@ -128,7 +128,7 @@ struct Aircraft : public Vehicle {
 
	Aircraft() { this->type = VEH_AIRCRAFT; }
 

	
 
	/** We want to 'destruct' the right class. */
 
	virtual ~Aircraft() {}
 
	virtual ~Aircraft() { this->PreDestructor(); }
 

	
 
	const char *GetTypeString() const { return "aircraft"; }
 
	void MarkDirty();
src/roadveh.h
Show inline comments
 
@@ -72,7 +72,7 @@ struct RoadVehicle : public Vehicle {
 
	RoadVehicle() { this->type = VEH_ROAD; }
 

	
 
	/** We want to 'destruct' the right class. */
 
	virtual ~RoadVehicle() {}
 
	virtual ~RoadVehicle() { this->PreDestructor(); }
 

	
 
	const char *GetTypeString() const { return "road vehicle"; }
 
	void MarkDirty();
src/ship.h
Show inline comments
 
@@ -37,7 +37,7 @@ struct Ship: public Vehicle {
 
	Ship() { this->type = VEH_SHIP; }
 

	
 
	/** We want to 'destruct' the right class. */
 
	virtual ~Ship() {}
 
	virtual ~Ship() { this->PreDestructor(); }
 

	
 
	const char *GetTypeString() const { return "ship"; }
 
	void MarkDirty();
src/train.h
Show inline comments
 
@@ -262,7 +262,7 @@ struct Train : public Vehicle {
 
	Train() { this->type = VEH_TRAIN; }
 

	
 
	/** We want to 'destruct' the right class. */
 
	virtual ~Train() {}
 
	virtual ~Train() { this->PreDestructor(); }
 

	
 
	const char *GetTypeString() const { return "train"; }
 
	void MarkDirty();
src/vehicle.cpp
Show inline comments
 
@@ -562,7 +562,7 @@ bool IsEngineCountable(const Vehicle *v)
 
	}
 
}
 

	
 
Vehicle::~Vehicle()
 
void Vehicle::PreDestructor()
 
{
 
	if (IsValidStationID(this->last_station_visited)) {
 
		GetStation(this->last_station_visited)->loading_vehicles.remove(this);
 
@@ -579,8 +579,6 @@ Vehicle::~Vehicle()
 
		if (this->IsPrimaryVehicle()) DecreaseGroupNumVehicle(this->group_id);
 
	}
 

	
 
	DeleteVehicleNews(this->index, INVALID_STRING_ID);
 

	
 
	this->QuickFree();
 
	if (this->type == VEH_ROAD) ClearSlot(this);
 

	
 
@@ -589,10 +587,7 @@ Vehicle::~Vehicle()
 
	}
 

	
 
	this->cargo.Truncate(0);
 
	UpdateVehiclePosHash(this, INVALID_COORD, 0);
 
	this->next_hash = NULL;
 
	this->next_new_hash = NULL;
 
	if (IsPlayerBuildableVehicleType(this)) DeleteVehicleOrders(this);
 
	DeleteVehicleOrders(this);
 

	
 
	/* Now remove any artic part. This will trigger an other
 
	 *  destroy vehicle, which on his turn can remove any
 
@@ -600,6 +595,15 @@ Vehicle::~Vehicle()
 
	if ((this->type == VEH_TRAIN && EngineHasArticPart(this)) || (this->type == VEH_ROAD && RoadVehHasArticPart(this))) {
 
		delete this->next;
 
	}
 
}
 

	
 
Vehicle::~Vehicle()
 
{
 
	UpdateVehiclePosHash(this, INVALID_COORD, 0);
 
	this->next_hash = NULL;
 
	this->next_new_hash = NULL;
 

	
 
	DeleteVehicleNews(this->index, INVALID_STRING_ID);
 

	
 
	new (this) InvalidVehicle();
 
}
src/vehicle.h
Show inline comments
 
@@ -347,6 +347,8 @@ struct Vehicle : PoolItem<Vehicle, Vehic
 
	/** Create a new vehicle */
 
	Vehicle();
 

	
 
	/** Destroy all stuff that (still) needs the virtual functions to work properly */
 
	void PreDestructor();
 
	/** We want to 'destruct' the right class. */
 
	virtual ~Vehicle();
 

	
0 comments (0 inline, 0 general)