本人最近在准备研究生入学考试,在看指定教材的时候遇到了如下的困惑,昨天在图书馆查了一天的资料也没有解决,所以现在来请各位大侠指点。我选了一段程序如下:template<class T> class List;   //类的前导声明//链表结点类定义
template<class T> class ListNode{   
public:
    friend class List<T>;
private:
    T data;
    ListNode<T>  *link;
public:
    //构造函数
    ListNode():link(NULL){}
    ListNode(T item,ListNode<T> *next=NULL):data(item),link(next){}   //结点类操作函数
   ListNode<T> *getLink(){return link;}     //获取下一个结点的指针
   void setLink(ListNode<T> *next){link=next;}  //设置下一个结点的指针   T getData(){return data;}         //获取结点的数据
   void setData(T value){data=value;}   //设置结点的数据
};//链表类的声明
template<class T>  class List{private:
    ListNode<T> *first,*current;  //链表的表头指针和当前元素的指针public:
    .
    .
    .
    int Length() const;     //计算链表的长度
};//计算带表头链表的长度
template<class T> int List<T>::Length()
{
    ListNode<T> *p=first->link;
    int count=0;
    while(p!=NULL)      //在链表中循环扫描
    {
        p=p->link;
        count++;
    }
    return count;    //返回结点数目
}我的问题在这里:
   1、类ListNode将List类声明为友元类,所以List类中的成员函数可以任意
的访问类ListNode中的成员。但在函数int List<T>::Length()中,定义了一个
ListNode<T> *p指针对象,而在类ListNode中,link被声明为private的访问级
别,因此一个ListNode<T>对象是不能直接访问link的,意思说:
    *p=first->link;
     p=p->link;
上面两个语句是错误的,应该用如下的形式代替:
    *p=first->getLink();
     p=p->getLink();
这是通过类ListNode的公共接口来访问它自己的私有成员变量。但问题的最关键
是那本指定的数据结构统统采用的是类似:*p=first->link; 的访问方式,我不
知道这到底是怎么回事,希望各位大侠指点迷津!
 

解决方案 »

  1.   

    这没有什么错误
    首先,那两句代码出现在List的函数中,而List是ListNode的友元,所以访问完全正确。
    其次,ListNode难道不能访问ListNode的成员变量吗?因为ListNode等于ListNode,所以ListNode也是ListNode的友元。换句话说:你用个人名义存钱,然后你就取不出来了,这合理吗?
    打击你一下,我今年研究生毕业了,可我对中国的学校教育也彻底失去信心了
    别的不说了,上面的代码多么没有效率,有一点实用价值吗?这就是中国的学校教育。
      

  2.   

    好像我没看出你的
    template<class T> int List<T>::Length()
    {
        ListNode<T> *p=first->link;
        int count=0;
        while(p!=NULL)      //在链表中循环扫描
        {
            p=p->link;
            count++;
        }
        return count;    //返回结点数目
    }
    有什么错也,你试着编译一下,编译通的过,你再来考虑这个问题好吗。虽然你是在看书,实际上,你最关心的应该是编译器怎样做的,再考虑自己的想法是不是有问题。还有你这样的学方法还像不好,在看代码的过程中,遇到无论什么问题,首先看看编译器是怎样对待这个问题的,其次才去找资料看书。呵呵,你好像化了一些冤枉的时间在图书馆。