☆☆☆☆☆紧急求救:关于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; 的访问方式,我不
知道这到底是怎么回事,希望各位大侠指点迷津!
问题点数:20、回复次数:6Top
1 楼sevecol(sevecol.blogone.net)回复于 2003-09-04 10:10:45 得分 10
在友元类的函数中可以访问,不需要使用公共接口,不然还声明成友元干什么?
template<class T> int List<T>::Length() const
{
ListNode<T> *p=first->link;
int count=0;
while(p!=NULL) //在链表中循环扫描
{
p=p->link;
count++;
}
return count; //返回结点数目
}Top
2 楼enterprise54(忘掉她好难)回复于 2003-09-04 10:16:56 得分 0
我知道友元函数可以直接访问它的私有变量,但问题是ListNode<T> *p是一个ListNode<T>对象啊,而一个对象是不能直接访问其私有成员变量的啊!Top
3 楼bluedodo(笑三少)回复于 2003-09-04 10:22:29 得分 2
看不出哪有什么问题,很正常的一个程序Top
4 楼sevecol(sevecol.blogone.net)回复于 2003-09-04 10:23:50 得分 8
访问限制只是编译器做的限制.
一个简单的例子
class BTest;
class ATest
{
friend BTest;
public:
ATest(int num):m(num){};
private:
int m;
};
class BTest
{
public:
void print()
{
ATest a(100);
cout<<a.m;
};
};Top
5 楼enterprise54(忘掉她好难)回复于 2003-09-04 10:51:25 得分 0
我知道自己犯了什么错误了!谢谢各位!Top
6 楼rotation(很明顯)回复于 2003-09-04 11:12:11 得分 0
類控制著哪些代碼可以存取它的成員,誰可以訪問我的私有實現部份在任何關係中都很重要.
如果你申明B類是A類的友元,那麼在B類的成員函數中就可以任意的訪問A類的成員,不論你
是通過創建A類對象還是使用A類指針來訪問,現在A類對B類是公開的;
你也可以只申明B類某個函數是A類的友元,那麼只有B類的該函數可以訪問A類的成員,而其他的
函數則不能訪問;
現在List類是ListNode類的友元,所以在List類的成員函數中完全可以訪問ListNode的成員變量.
友元就是要告訴編譯器哪些代碼可以訪問類的成員!Top




