初学模板,写了个简单的程序,有有关问题
初学模板,写了个简单的程序,有问题
template <class T>
Node* CLinkStack<T>::Top(void)
这个地方不能通过,应该怎么写呢?
---------------------------------------------
template <class T>
class CLinkStack
{
private:
typedef struct tagNode
{
T data;
struct tagNode* next;
}Node;
public:
CLinkStack(void);
~CLinkStack(void);
public:
bool IsEmpty(void);
void Push(Node* p);
Node* Pop(void);
void Pop2(void);
Node* Top(void);
private:
Node** top;
};
template <class T>
CLinkStack<T>::CLinkStack(void)
{
top = (Node**)malloc(sizeof(Node*));
*top = NULL;
}
template <class T>
CLinkStack<T>::~CLinkStack(void)
{
Node* p = NULL;
while(!IsEmpty())
{
p = *top;
*top = p->next;
delete p;
}
p = NULL;
delete top;
top = NULL;
}
template <class T>
bool CLinkStack<T>::IsEmpty(void)
{
assert(top);
return (*top == NULL);
}
template <class T>
void CLinkStack<T>::Push(Node* p)
{
assert(top);
p->next = *top;
*top = p;
}
template <class T>
Node* CLinkStack<T>::Pop(void)
{
assert(top);
Node* p = NULL;
if(!IsEmpty())
{
p = *top;
top = &p->next;
}
return p;
}
template <class T>
void CLinkStack<T>::Pop2(void)
{
assert(top);
Node* p = Pop();
delete p;
p = NULL;
}
template <class T>
Node* CLinkStack<T>::Top(void)
{
assert(top);
Node* p = NULL;
if(!IsEmpty())
{
p = *top;
}
return p;
}
------解决方案--------------------
Node是定义在CLinkStack 内部的,要加上作用域
template <class T>
Node* CLinkStack<T>::Top(void)
这个地方不能通过,应该怎么写呢?
---------------------------------------------
template <class T>
class CLinkStack
{
private:
typedef struct tagNode
{
T data;
struct tagNode* next;
}Node;
public:
CLinkStack(void);
~CLinkStack(void);
public:
bool IsEmpty(void);
void Push(Node* p);
Node* Pop(void);
void Pop2(void);
Node* Top(void);
private:
Node** top;
};
template <class T>
CLinkStack<T>::CLinkStack(void)
{
top = (Node**)malloc(sizeof(Node*));
*top = NULL;
}
template <class T>
CLinkStack<T>::~CLinkStack(void)
{
Node* p = NULL;
while(!IsEmpty())
{
p = *top;
*top = p->next;
delete p;
}
p = NULL;
delete top;
top = NULL;
}
template <class T>
bool CLinkStack<T>::IsEmpty(void)
{
assert(top);
return (*top == NULL);
}
template <class T>
void CLinkStack<T>::Push(Node* p)
{
assert(top);
p->next = *top;
*top = p;
}
template <class T>
Node* CLinkStack<T>::Pop(void)
{
assert(top);
Node* p = NULL;
if(!IsEmpty())
{
p = *top;
top = &p->next;
}
return p;
}
template <class T>
void CLinkStack<T>::Pop2(void)
{
assert(top);
Node* p = Pop();
delete p;
p = NULL;
}
template <class T>
Node* CLinkStack<T>::Top(void)
{
assert(top);
Node* p = NULL;
if(!IsEmpty())
{
p = *top;
}
return p;
}
------解决方案--------------------
Node是定义在CLinkStack 内部的,要加上作用域
- C/C++ code
template <class T> class CLinkStack { private: typedef struct tagNode { T data; struct tagNode* next; }Node; public: CLinkStack(void); ~CLinkStack(void); public: bool IsEmpty(void); void Push(Node* p); Node* Pop(void); void Pop2(void); Node* Top(void); private: Node** top; }; template <class T > CLinkStack <T >::CLinkStack(void) { top = (Node**)malloc(sizeof(Node*)); *top = NULL; } template <class T > CLinkStack <T >::~CLinkStack(void) { Node* p = NULL; while(!IsEmpty()) { p = *top; *top = p- >next; delete p; } p = NULL; delete top; top = NULL; } template <class T> bool CLinkStack <T>::IsEmpty(void) { assert(top); return (*top == NULL); } template <class T> void CLinkStack <T>::Push(Node* p) { assert(top); p->next = *top; *top = p; } template<class T> CLinkStack<T>::Node* CLinkStack <T>::Pop(void) { assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; top = &p->next; } return p; } template <class T> void CLinkStack <T>::Pop2(void) { assert(top); Node* p = Pop(); delete p; p = NULL; } template <class T> CLinkStack<T>::Node* CLinkStack <T>::Top(void) { assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; } return p; }
------解决方案--------------------
- C/C++ code
#include<stdio.h> #include<stdlib.h> #include<assert.h> template <class T > class CLinkStack { private: struct Node { T data; Node* next; }; public: CLinkStack(void); ~CLinkStack(void); public: bool IsEmpty(void); void Push(Node* p); Node* Pop(void); void Pop2(void); Node* Top(void); private: Node** top; }; template <class T > CLinkStack <T >::CLinkStack(void) { top = (Node**)malloc(sizeof(Node*)); *top = NULL; } template <class T > CLinkStack <T >::~CLinkStack(void) { Node* p = NULL; while( !IsEmpty() ) { p = *top; *top = p->next; delete p; } p = NULL; delete top; top = NULL; } template <class T > bool CLinkStack <T >::IsEmpty(void) { assert(top); return (*top == NULL); } template <class T > void CLinkStack <T >::Push(Node* p) { assert(top); p->next = *top; *top = p; } template <class T > typename CLinkStack<T>::Node* CLinkStack<T>::Pop(void) { assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; top = &p->next; } return p; } template <class T > void CLinkStack<T>::Pop2(void) { assert(top); Node* p = Pop(); delete p; p = NULL; } template <class T > typename CLinkStack<T>::Node* CLinkStack<T>::Top(void) { assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; } return p; } int main() { CLinkStack<int> x; }