Lesson3 | Lifeform abstract base class |
Objective | Examine the abstract base class for the lifeforms in the ecological simulation. |
Lifeform Abstract Base Class
In our primitive ecological simulation, the "world" will have different forms of life interacting. We will begin by examining the abstract
base class for the lifeforms, which are living
. Its interface will be inherited by various forms of life.
In this simulation, foxes are the archetypal predator and rabbits are the prey. The rabbits will eat grass.
//Predator-Prey simulation using class living
const int N = 40; //size of square board
enum state { EMPTY, GRASS, RABBIT, FOX, STATES };
const int DRAB = 3, // used to determine lifespan
DFOX = 6, // used to determine lifespan
CYCLES = 5; // number of cycles
// simulation will run
class living; //forward declaration
typedef living* world[N][N]; //world is simulation
class living { //what lives in world
public:
virtual state who() = 0; //state identification
virtual living* next(world w) = 0; //compute next
protected:
int row, column; //location
void sums(world w, int sm[]);
//sm[#states] used by next()
};
void living::sums(world w, int sm[]){
int i, j;
sm[EMPTY] = sm[GRASS] = sm[RABBIT] = sm[FOX] = 0;
for (i = -1; i <= 1; ++i)
for ( j = -1; j <= 1; ++j)
sm[w[row + i][column +j] -> who()]++;
}
Two pure virtual functions
There are two pure virtual functions. Virtual functions incur a small added runtime cost over normal member functions.
Therefore, we use them only when necessary to our implementations.
There is also one ordinary member function, sums()
. Our simulation will have rules for deciding who goes on living in the next cycle based on the populations in the neighborhood of a given square. These populations are computed by sums()
.
Next, we will look at the inheritance hierarchy of living
.