Hi all,
Here's the deal, I have two data structures ( a stack and a queue ) implementing in a "rat in a maze" classic solver.
for the sake of the reader and not to make this thread extra long, I will post how my virtual functions and declarations of each of my stack and queue header files look like and you'll get the idea...
Stack header:
Code:
template<class T>
class stack
{
public:
virtual ~stack() {}
virtual bool empty() const = 0;
// return true iff stack is empty
virtual int size() const = 0;
// return number of elements in stack
virtual T& top() = 0;
// return reference to the top element
virtual void pop() = 0;
// remove the top element
virtual void push(const T& theElement) = 0;
// insert theElement at the top of the stack
};
template<class T>
class arrayStack : public stack<T>
{
public:
arrayStack(int initialCapacity = 10);
~arrayStack() {delete [] stack;}
bool empty() const {return stackTop == -1;}
int size() const
{return stackTop + 1;}
T& top()
{
if (stackTop == -1)
throw stackEmpty();
return stack[stackTop];
}
void pop()
{
if (stackTop == -1)
throw stackEmpty();
stack[stackTop--].~T(); // destructor for T
}
void push(const T& theElement);
private:
int stackTop; // current top of stack
int arrayLength; // stack capacity
T *stack; // element array
};
Queue header:
Code:
template<class T>
class queue
{
public:
virtual ~queue() {}
virtual bool empty() const = 0;
// return true iff queue is empty
virtual int size() const = 0;
// return number of elements in queue
virtual T& front() = 0;
// return reference to the front element
virtual T& back() = 0;
// return reference to the back element
virtual void pop() = 0;
// remove the front element
virtual void push(const T& theElement) = 0;
// add theElement at the back of the queue
};
template<class T>
class arrayQueue : public queue<T>
{
public:
arrayQueue(int initialCapacity = 10);
~arrayQueue() {delete [] queue;}
bool empty() const {return theFront == theBack;}
int size() const
{return (theBack - theFront + arrayLength) % arrayLength;}
T& front()
{// return front element
if (theFront == theBack)
throw queueEmpty();
return queue[(theFront + 1) % arrayLength];
}
T& back()
{// return theBack element
if (theFront == theBack)
throw queueEmpty();
return queue[theBack];
}
void pop()
{// remove theFront element
if (theFront == theBack)
throw queueEmpty();
theFront = (theFront + 1) % arrayLength;
queue[theFront].~T(); // destructor for T
}
void push(const T& theElement);
private:
int theFront; // 1 counterclockwise from theFront element
int theBack; // position of theBack element
int arrayLength; // queue capacity
T *queue; // element array
};
My concern is that, in my .cpp file I have the following global declarations:
Code:
#define WIDTH 15
#define HEIGHT 15
int maze_ [WIDTH][HEIGHT];
int width_;
int height_;
stack stack_; // must use this variable to refer your stack
queue queue_; // must use this variable to refer your queue
int traveled_; // must use this variable to store your pop actions
int pathLength_; // must use this variable to store the length of the path
My concern is that those stack_ and queue_ variables are not playing nice with the compiler that way I have them declared.
I get this error:
maze.cpp:14: error: expected constructor, destructor, or type conversion before ‘;’ token
maze.cpp:15: error: expected constructor, destructor, or type conversion before ‘;’ token
I tried declaring them as simple arrayStack<int> stack_ and same for queue, but that doesn't work either, and its not what I really want.
Any help??
Thanks for reading and I appreciate any feedback,
Fed