linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 软件开发 >
栏目导栏
资料搜索
热门文章
·Linux 下 C 语言编程
·Linux下的通用线程池创建
·C++字符串转换篇
·linux C 进程操作篇
·linux上的C/C++编译器gcc/egcs
·linux C 文件权限控制篇
·GCC使用手册
·linux C 接口处理篇
·在Redhat Linux上安装 GCC 编译
·fopen()函数的参数说明
·C语言运算符
·GCC使用指南
·Linux下C开发环境的构成和安装
·GCC使用手册与常用命令
·Linux常用C函数-日期时间篇
最新文章
·epoll入门
·在Linux下发布程序需要注意版本
·Suse Linux系统下JAVA AWT界面
·Vim编译器配合ctags实现函数原
·在Ubuntu Linux 8.04上构建GCC
·Linux操作系统下Socket编程地址
·将VC程序移植到Linux系统的几点
·Linux下malloc/free与new/dele
·Linux下用GTK和socket实现简单
·Linux操作系统下让Tomcat启动在
·Linux操作系统中如何编译C程序
·几种常被人们忽略的Linux系统下
·Eclipse编程工具 在Ubuntu下的
·Linux操作系统下的网络地址转换
·老手经验谈:Linux驱动程序开发
Google
 
C++的友员机制
[ 作者:  加入时间:2007-09-12 11:41:55  来自:Linux联盟收集整理 ]

C++中,struct关键字和class关键字功能基本一致,除了struct的默认控制为publicclassprivate之外。友员指的是可以对某个struct或者class的内部私有数据进行访问的对象、全局函数或者某种类型对象的内部函数。下面是友员机制的例子:

 

struct X; //预先声明结构X

struct Y{

   void f(X *);

};

struct X{   //此处对结构X进行定义

   private:

      int i;

   public:

       void initialize();

       friend void g(X*,int);

       friend void Y::f(X*);

       friend struct Z;

       friend void h();

};

void X::initialize(){i=0;}

void g(X* x,int i){x->i=i;}

void Y::f(X* x){x->i=47;}

struct Z{

   private:

      int j;

  public:

     void initialize();

     void g(X* x);

};

void Z::initialize(){j=99;}

void Z::g(X * x){x->i=j;}

void h(){X x;x.i=100;}

main(){

   X x;

   Z z;

   z.g(&x);

}

 

同时友员也支持struct或者class的嵌套。

#include <stdio.h>

#include <string.h>

#define SZ 20

 

//This is an example for friend of embeded.

//here,keyword class may be replaced by struct

 

class holder{

  private:

     int a[SZ];

  public:

     void initialize();

     friend struct pointer;

     class pointer{

          private:

             holder * h;

             int * p;

          public:

             void initialize(holder * H);

             void next();

             void previous();

             void top();

             void end();

             int read();

             void set(int i);

     };

     //friend holder::pointer; //this format is wrong

     //friend struct pointer;  //also could be moved here

};

 

void holder::initialize()

{

   memset(a,0,SZ*sizeof(int));

}

void holder::pointer::initialize(holder * H)

{

  h=H;

  p=h->a;

}

void holder::pointer::next(){

   if (p<&(h->a[SZ-1]))p++;

}

void holder::pointer::previous()

{

   if (p>&(h->a[0])) p--;

}

void holder::pointer::top()

{

  p=&(h->a[0]);

}

void holder::pointer::end()

{

  p=&(h->a[SZ-1]);

}

 

int holder::pointer::read()

{

  return *p;

}

 

void holder::pointer::set(int i)

{

  *p=i;

}

 

main()

{

  holder h;

  holder::pointer hp,hp2;

  int i;

 

  h.initialize();

  hp.initialize(&h);

  hp2.initialize(&h);

  for (i=0;i<SZ;i++)

  {

    hp.set(i);

    hp.next();

  }

  hp.top();

  hp2.end();

 

  for(i=0;i<SZ;i++)

  {

    printf("hp=%d,hp2=%d\n",hp.read(),hp2.read());

    hp.next();

    hp2.previous();

  }

}

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·C++中的命名空间  (2007-09-12 11:41:22)
 ·TEA加密算法的C/C++实现  (2007-09-11 11:02:34)
 ·论C/C++函数间动态内存的传递  (2007-09-02 22:46:09)
 ·在Ubuntu Linux中运行TC3(Turbo C++ 3.0)  (2007-08-13 09:18:43)
 ·在C/C++中如何构造通用的对象链表  (2007-06-13 17:08:09)
 ·浅议C++/CLI的gcnew关键字  (2007-06-08 19:34:48)
 ·用C++库连接Oracle, MS SQL, MySQL等数据库  (2007-06-04 12:19:01)
 ·Linux环境中使用的开放源代码 C/C++ 矩阵库  (2007-05-31 07:24:18)
 ·C++数据类型的属性与限制  (2007-05-22 07:16:16)
 ·C/C++程序编译步骤详解  (2007-04-24 11:57:48)