设为首页 加入收藏

TOP

3.1.2 成员函数的实现
2013-10-07 00:08:03 来源: 作者: 【 】 浏览:60
Tags:3.1.2 成员 函数 实现

3.1.2  成员函数的实现

为了定义类模板的成员函数,你必须指定该成员函数是一个函数模板,而且你还需要使用这个类模板的完整类型限定符 。因此,类型Stack<T>的成员函数push()的实现如下:

 template <typename T>
void Stack<T>::push (T const& elem)
{
elems.push_back (elem); //把传入实参elem的拷贝               //附加到末端
}

在上面的例子中,调用了对应vector的push_back()方法,它把传入元素附加到该vector的末端。

请注意:vector的pop_back()方法只是删除末尾的元素,并没有返回该元素;之所以如此是充分考虑了异常安全性,因为要实现“一个绝对异常安全并且返回被删除元素的pop()”是不可能的(Tom Cargill在[CargillExceptionSafety]中首次讨论了这个话题,Sutter在[SutterExceptional]的Item 10也提到这个问题)。然而,如果不考虑异常安全性,我们就可以实现一个返回被删除元素的pop()。事实上,只需要使用T声明一个局部变量,并保证该变量的类型就是vector元素的类型即可;具体如下:

template<typename T>
T Stack<T>::pop()
{
if (elems.empty() ) {
throw std::out_of_range(“Stack<>::pop(): empty Stack”);
}
T elem = elems.back();  //先保存末端元素的拷贝
elems.pop_back();   //删除末端元素
return elem;     //返回上面保存的元素的拷贝
}

因为当vector为空的时候,它的back()方法(返回末端元素的值)和pop_back()方法(删除末端元素)会具有未加定义的行为,因此我们需要先检查该stack是否为空。如果为空,就抛出std::out_of_range异常。同样,在top()的实现中,我们也是用这种办法来判断对应stack是否为空;top()只是返回栈的顶端 元素,并不删除该元素:

template<typename T>
T Stack<T>::top() const
{
if (elems.empty()) {
throw std::out_of_range(“Stack::top(); empty Stack”);
}
return elems.back();  //返回末端元素的拷贝
}

显然,对于类模板的任何成员函数,你都可以把它实现为内联函数,将它定义于类声明里面。例如:

template <typename T>
class Stack {
...
void push (T const& elem) {
elems.push_back(elem); //把传入的elem实参附加到末端
}
...
};


回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.1.1 类模板的声明 下一篇3.3 类模板的特化

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: