今天,在编写一个顺序表类时,遇到了一个问题,遍历函数traverse参照英文Data Structures书上的构造方式,只可以调用到类以外的普通函数,却总是无法调用到类内的成员函数,百思不得其解。
以下是书上给的构造方式:
CSList类中:
template
void CSList::traverse(void (*visit)(List_entry &))
{
for(int i=0;i {
(*visit)(entry[i]);
}
return;
}
类外:
template
void printlist(List_entry &x) //非类成员函数,破坏封装性
{
cout << x << endl;
return;
}
main 函数中:
CSList csList;
csList.traverse(printlist);
而这样的函数指针,只可以引用到普通的类外函数,如果不使用类成员函数,会破坏OOP编程的封装性,因此苦苦找寻多方资料,仍无法解决。最后,情急之下想起了this指针,问题迎刃而解,解决方法如下:
CSList类中:
template
void CSList::printlist(List_entry &x)//成功封装在CSList类内
{
cout << x << endl;
return;
}
template
void CSList::traverse(void (CSList::*visit)(List_entry &))
{
for(int i=0;i {
(this->*visit)(entry[i]);
}
return;
}
main 函数中:
CSList csList;
csList.traverse(&CSList::printlist);
同时,“CSList::*visit ”不写成“CSList::*visit”的原因是由于:这里面的“CSList::”仅仅提供了一个函数地址的偏移量,而与模板类与否没有关系,因此正确使用方式为前者。
希望本文内容能够帮助您解决问题。
阅读(1004) | 评论(0) | 转发(0) |