读书人

初学模板新有关问题。

发布时间: 2012-02-29 16:44:10 作者: rapoo

初学模板,新问题。。
谢谢大家的解答,
觉得 yanhailiangyhl 说的很对,

如何在 所有的接口里不要出现Node,包括返回值和参数

谁能把这个例子改写的更通用一点!谢谢,学习一下

原帖:
http://topic.csdn.net/u/20071012/10/3679cedb-747c-483a-b5e7-14f872808fb4.html


[解决办法]
我在原贴改写了两个函数,顺便贴过来,一开始也可以想明白,现在觉得是要封装的严格一些好,才能保证栈本身的正确性
template <class T >
void CLinkStack <T >::Push(T x)
{
assert(top);
Node* pNode = new Node;
pNode- >data = x;
p- >next = *top;
*top = p;
}

template <class T >
T* CLinkStack <T >::Pop(void)
{
assert(top);
T *x = new NULL;
if(!IsEmpty())
{
Node * p = *top;
top = *top- >next;
x = new T(p- >data);
delete p;
}
return x;
}

我修改两个函数
关于push 入栈:
客户调用该函数直接给元素就可以了,不必自己再new出一个Node了
关于Pop出栈;
直接返回指向顶元素值的指针。注意这个指针指向的地址空间是再函数里面New出来的,需要在客户端负责释放,所以,这也不是最好办法。应该返回T对象最好,这样就安全了。但是需要处理当前栈为空的情况。即需要栈为空时抛异常出来,而不返回任何T对象。
总之,这样要比把top节点直接返回安全多了,按照楼主原来的pop函数return的结节p,p- >nest是指向pop后的top节点的。那么客户就可以直接用这个节点来任意修改栈了,这样,这个栈就一点封装性都没有了,这样是很不安全的做法。

读书人网 >C++

热点推荐