本人最近在准备研究生入学考试,在看指定教材的时候遇到了如下的困惑,昨天在图书馆查了一天的资料也没有解决,所以现在来请各位大侠指点。我选了一段程序如下: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; 的访问方式,我不
知道这到底是怎么回事,希望各位大侠指点迷津!
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; 的访问方式,我不
知道这到底是怎么回事,希望各位大侠指点迷津!
首先,那两句代码出现在List的函数中,而List是ListNode的友元,所以访问完全正确。
其次,ListNode难道不能访问ListNode的成员变量吗?因为ListNode等于ListNode,所以ListNode也是ListNode的友元。换句话说:你用个人名义存钱,然后你就取不出来了,这合理吗?
打击你一下,我今年研究生毕业了,可我对中国的学校教育也彻底失去信心了
别的不说了,上面的代码多么没有效率,有一点实用价值吗?这就是中国的学校教育。
template<class T> int List<T>::Length()
{
ListNode<T> *p=first->link;
int count=0;
while(p!=NULL) //在链表中循环扫描
{
p=p->link;
count++;
}
return count; //返回结点数目
}
有什么错也,你试着编译一下,编译通的过,你再来考虑这个问题好吗。虽然你是在看书,实际上,你最关心的应该是编译器怎样做的,再考虑自己的想法是不是有问题。还有你这样的学方法还像不好,在看代码的过程中,遇到无论什么问题,首先看看编译器是怎样对待这个问题的,其次才去找资料看书。呵呵,你好像化了一些冤枉的时间在图书馆。