Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1046894
  • 博文数量: 254
  • 博客积分: 10185
  • 博客等级: 上将
  • 技术积分: 2722
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-25 15:04
文章存档

2011年(8)

2009年(1)

2008年(31)

2007年(214)

分类:

2007-12-01 23:34:11

    今天,在编写一个顺序表类时,遇到了一个问题,遍历函数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::”仅仅提供了一个函数地址的偏移量,而与模板类与否没有关系,因此正确使用方式为前者。
 
希望本文内容能够帮助您解决问题。
阅读(972) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~