☆☆☆☆☆紧急求救:关于C++版数据结构中的一些探讨和困惑☆☆☆☆☆
本人最近在准备研究生入学考试,在看指定教材的时候遇到了如下的困惑,昨天在图书馆查了一天的资料也没有解决,所以现在来请各位大侠指点。
我选了一段程序如下:
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; 的访问方式,我不
知道这到底是怎么回事,希望各位大侠指点迷津!
问题点数:0、回复次数:6Top
1 楼MSN3000(气死我了)回复于 2003-09-04 10:14:08 得分 0
ListNode的成员函数可以放问的东西,为什么他的友员类List的成员函数就不能放问呢?
注意:是外部函数不能访问!!!List的成员函数。。。。。。 也属于公有接口来。。Top
2 楼neubird(带发修行的猪)回复于 2003-09-04 10:27:58 得分 0
你仔细看清楚:
*p=first->link;
p=p->link;
这两种写法是写在了哪儿,如果是在ListNode自己的成员函数,或它的友元List的成员函数中,当然可以直接访问!
Top
3 楼neubird(带发修行的猪)回复于 2003-09-04 10:28:15 得分 0
你仔细看清楚:
*p=first->link;
p=p->link;
这两种写法是写在了哪儿,如果是在ListNode自己的成员函数,或它的友元List的成员函数中,当然可以直接访问!
Top
4 楼steedhorse(晨星)回复于 2003-09-04 10:31:30 得分 0
都被你搞糊涂了,呵呵。类的函数当然可以访问自己的成员,访问控制机制只对外,不对内。Top
5 楼steedhorse(晨星)回复于 2003-09-04 10:32:25 得分 0
都被你搞糊涂了,呵呵。类的函数当然可以访问自己的成员,访问控制机制只对外,不对内。Top
6 楼neubird(带发修行的猪)回复于 2003-09-04 10:33:04 得分 0
这样说吧,对于public,protected,private等关键字,只是编译器来做检查,在自己或友元的成员函数中,编译器就允许这样来写。Top
7 楼enterprise54(忘掉她好难)回复于 2003-09-04 10:52:05 得分 0
我知道自己犯了什么错误了!谢谢各位!
Top
8 楼steedhorse(晨星)回复于 2003-09-04 18:32:33 得分 0
不用客气,:PTop



