Reputation: 245
I created an abstract class which is named "list" and i inherited "list" class to create a queue and a stack. But when i tried to compile the code, i got errors which is pointing that "tail, head , next" are not recognised or unknown.
#include <iostream>
#include <cstdlib>
using namespace std;
template <typename T>
class list{
public:
T data;
list<T> * head;
list<T> * tail;
list<T> * next;
list(){head = tail = next = NULL;}
virtual ~list(){}
virtual void store(T) = 0;
virtual T retrieve() = 0;
};
// QUEUE
template <typename T>
class queue : public list<T>{
public:
virtual void store(T);
virtual T retrieve();
};
template <typename T>
void queue<T>::store(T d){
list<T> * temp = new queue<T>;
if (!temp) exit(EXIT_FAILURE);
temp->data = d;
temp->next = NULL;
if(tail){
tail->next = temp;
tail = temp;
}
if(!head) head = tail = temp;
}
template <typename T>
T queue<T>::retrieve(){
T i;
list<T> * temp;
i = head->data;
temp = head;
head = head->next;
delete temp;
return i;
}
// STACK
template <typename T>
class stack : public list<T>{
public:
virtual void store(T i);
virtual T retrieve();
};
template <typename T>
void stack<T>::store(T d){
list<T> * temp = new stack<T>;
if(!temp) exit(EXIT_FAILURE);
temp->data = d;
if (tail) temp->next = tail;
tail = temp;
if(!head) head = tail;
}
template <typename T>
T stack<T>::retrieve(){
T i;
list<T> * temp;
i = tail->data;
temp = tail;
tail = tail->next;
delete temp;
return i;
}
int main(){
queue<int> mylist;
for(int i = 0; i < 10; i++)
mylist.store(i);
for(int i = 0; i < 10; i++)
cout << mylist.retrieve() << endl;
}
i have created an abstract class which is named "list" and i inherited "list" class to create a queue and a stack. But when i tried to compile the code, i got errors which is pointing that "tail, head , next" are not recognized or unknown.
error is below:
..\main.cpp: In member function 'virtual T stack<T>::retrieve()':
..\main.cpp:86:6: error: 'tail' was not declared in this scope
Upvotes: 1
Views: 98
Reputation: 1
Explicitly refer to the base class scope to access the inherited member variables:
if(list<T>::tail){
// ^^^^^^^^^
list<T>::tail->next = temp;
// ^^^^^^^^^
list<T>::tail = temp;
// ^^^^^^^^^
}
Access via this
can be used alternatively:
if(this->tail){
// ^^^^^^
this->tail->next = temp;
// ^^^^^^
this->tail = temp;
// ^^^^^^
}
Upvotes: 2