CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

☆☆☆☆☆紧急求救:关于C++版数据结构中的一些探讨和困惑☆☆☆☆☆

楼主enterprise54(忘掉她好难)2003-09-04 09:50:58 在 C/C++ / 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

相关问题

  • c数据结构问题
  • C#与数据结构
  • c#中的数据结构.
  • 数据结构初始化的困惑
  • c和c++数据结构的差别
  • 数据结构的问题(c语言)
  • 数据结构与C++的关系!!
  • C++实现 队列的数据结构
  • 用C#实现数据结构
  • 热烈欢迎加入c语言学习交流群 大家共同探讨共同进步!!! 热烈欢迎数据结构高手加盟 qq群号12573954

关键词

  • 结点
  • 函数
  • 指针
  • template
  • null
  • listnode
  • 类
  • 访问
  • btest
  • 链表

得分解答快速导航

  • 帖主:enterprise54
  • sevecol
  • bluedodo
  • sevecol

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo