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

----———>菜鸟问简单问题~~~送分啦

楼主lizhanghui(拔刀术)2006-07-03 16:59:16 在 C/C++ / C++ 语言 提问

有两个类A   和B   。  
   
  在A中要使用B实例,并把自己的指针传给b,方便b访问A中的成员变量  
  //在A类中-----------------  
  Class   A  
  {  
      Public:  
          int   m_x;  
          void   xx();  
  }  
   
  void   A::xx()  
  {  
      B   b;  
      b.m_p(this);  
  }  
   
  //在类B中----------------------  
  Class   B  
  {  
      public:  
          A   *   m_p;  
          void   yy();  
  }  
  void   B::yy()  
  {  
      int   y   =   m_p->m_x;  
  }  
   
  现在因为两者要相互访问,变成要相互包含头文件,编译通不过,丢失存储类型  
   
  要实现这样的访问要怎么办呢?55555~~~ 问题点数:100、回复次数:20Top

1 楼sungengyu(快乐机器)回复于 2006-07-03 17:09:33 得分 20

A   用到   B   的实例,B   只用到   A   的指针。  
   
  把   B   放到   A   前面,然后在   B   前面声明   A   。  
   
  是声明,不是定义   :extern   class   A   ;    
   
   
  像这样:  
   
  //   声明   A  
  extern   class   A   ;  
   
  //   这里是   B   的定义  
  class   B  
  {  
  //   以下省略  
   
  //   这里是A的定义  
  class   A  
  //     以下省略Top

2 楼wanderfox()回复于 2006-07-03 17:16:49 得分 20

class   B;//这样?  
  Class   A  
  {  
  Public:  
  int   m_x;  
  void   xx();  
  }  
   
  void   A::xx()  
  {  
  B   b;  
  b.m_p(this);  
  }  
   
  //在类B中----------------------  
  Class   B  
  {  
  public:  
  A   *   m_p;  
  void   yy();  
  }  
  void   B::yy()  
  {  
  int   y   =   m_p->m_x;  
  }  
  Top

3 楼lizhanghui(拔刀术)回复于 2006-07-03 17:18:45 得分 0

这样是要把两个类放在同一个文件里么???  
  不行呀,vc生成的是分别在四个文件里的A.h       B.h         A.cpp       B.cpp  
  而且我也不想放在一个文件里  
  怎么办呢/???谢谢~~Top

4 楼wanderfox()回复于 2006-07-03 17:44:35 得分 0

可以是4个文件  
  在A.h     B.h的最前面加上  
  #ifndef   _DEBUG_A     //A.h中  
  (#ifndef_DEBUG_B)//B.h中  
  #define   _DEBUG_A  
  (#define   _DEBUG_B)  
  最后面加上  
  #endif  
  就行了Top

5 楼wanderfox()回复于 2006-07-03 17:46:00 得分 0

可以是4个文件  
  在A.h     B.h的最前面加上  
  #ifndef   _DEBUG_A     //A.h中  
  (#ifndef_DEBUG_B)//B.h中  
  #define   _DEBUG_A  
  (#define   _DEBUG_B)  
  最后面加上  
  #endif  
  就行了Top

6 楼lizhanghui(拔刀术)回复于 2006-07-03 17:58:29 得分 0

to         wanderfox()    
  看不懂诶~~~~~~~~~  
   
  Top

7 楼qhfu(改个名字)回复于 2006-07-03 18:13:55 得分 20

Class   B  
  {  
      public:  
          A   *   m_p;  
          void   yy();  
  }  
  void   B::yy()  
  {  
      int   y   =   m_p->m_x;  
  }  
   
  ===>  
   
  class   A;  
   
  Class   B  
  {  
      public:  
          A   *   m_p;  
          void   yy();  
  };  
  void   B::yy()  
  {  
      int   y   =   m_p->m_x;  
  }  
   
   
  =====================  
  Class   A  
  {  
      Public:  
          int   m_x;  
          void   xx();  
  };  
   
  void   A::xx()  
  {  
      B   b;  
      b.m_p(this);  
  }  
  ===>  
  #include   "B.h"  
  Class   A  
  {  
      Public:  
          int   m_x;  
          void   xx();  
  };  
   
  void   A::xx()  
  {  
      B   b;  
      b.m_p(this);  
  }  
  假设A   B   分别放在A.h   B.h   中  
  Top

8 楼diandian82(点点(nothing))回复于 2006-07-03 18:38:04 得分 10

前向引用Top

9 楼lizhanghui(拔刀术)回复于 2006-07-03 19:05:32 得分 0

恩~~~~  
  按照这个方法做了。  
  不过没通过编译。  
  报错:  
  B.cpp  
  B.cpp(101)   :   error   C2027:   use   of   undefined   type   'A'  
                  B.h(1)   :   see   declaration   of   'A'  
  B.cpp(101)   :   error   C2227:   left   of   '->m_x'   must   point   to   class/struct/union  
   
  双击后指向void   B::yy()  
                    {  
                          int   y   =   m_p->m_x;  
                    }  
  中的int   y   =   m_p->m_x;   这行。  
   
  将这行改成   A   *   temp   =   m_p;   可以通过编译。  
   
  为什么不能使用m_x变量呢???555~  
  是不是传递指针时传的是this指针所以不能访问???  
  为什么啊~~~  
  请指点  
  m(_   _)m   诚恳~~  
  一定加分Top

10 楼qhfu(改个名字)回复于 2006-07-03 22:26:01 得分 10

双击后指向void   B::yy()  
                    {  
                          int   y   =   m_p->m_x;  
                    }  
  中的int   y   =   m_p->m_x;   这行。  
   
  将这行改成   A   *   temp   =   m_p;   可以通过编译。  
   
  ========  
  把这些定义放在   .cpp   中,然后#include   两个头文件Top

11 楼avril1986swj(哈密瓜)回复于 2006-07-03 22:29:00 得分 5

学习……Top

12 楼lizhanghui(拔刀术)回复于 2006-07-04 10:18:52 得分 0

to   qhfu(崩贵)  
  应该不是这个原因,我是用vc的,类实现本来就是放在各自的.cpp文件里  
  在B.cpp中本来包含着B.h的  
  如果加上#include   "A.h"  
  编译后报错:error   C2039:   'm_nXy'   :   is   not   a   member   of   'CStation'  
  指向int   y   =   m_p->m_x;  
  大家可以试试  
  哪位大哥帮调调  
   
  是不是前想引用申明本来就无法调用其成员???  
   
  http://dev.wl668.com/c/c++/200510195604_4303066.shtml  
  这个地方的问题和我很像  
  他一样不可以使用前向引用声明的类的成员变量和成员函数  
  Top

13 楼lizhanghui(拔刀术)回复于 2006-07-04 10:24:05 得分 0

哦,对不起,包含了#include   "A.h"   后好象可以了,呵呵  
  实在不好意思  
   
  不过这样的话不是变成AB类相互包含了么Top

14 楼lizhanghui(拔刀术)回复于 2006-07-04 10:31:36 得分 0

看来单纯的前向引用只是让B类对   A类的指针定义通过,  
  然后还得在调用前加A类的头文件包含#include   "A.h"  
  这样才可以使用它的成员  
   
  不知道为什么  
  不过问题解决了,呵呵~~  
  如果没什么补充一小时后揭贴  
  分加到100,顶着有分Top

15 楼al0n9(终于有四条内裤了)回复于 2006-07-04 10:53:56 得分 0

void   A::xx()  
  {  
      B   b;  
      b.m_p(this);  
  }  
   
  b.m_p(this)这种用法我在VS2005下面编译有错误。Top

16 楼al0n9(终于有四条内裤了)回复于 2006-07-04 10:56:20 得分 5

哦,对不起,包含了#include   "A.h"   后好象可以了,呵呵  
  实在不好意思  
   
  不过这样的话不是变成AB类相互包含了么  
  =========================  
  不是相互包含。只是在A类的xx()函数里,有一个B类的局部对象而已。这跟在A类的定义中就包含一个B类的对象是完全不同的。  
  Top

17 楼lizhanghui(拔刀术)回复于 2006-07-04 11:12:34 得分 0

to:     al0n9(al0n9)  
  呵呵,不好意思,笔误  
  改成  
  void   A::xx()  
  {  
      B   b;  
      b.m_p   =   this;  
  };  
  Top

18 楼lizhanghui(拔刀术)回复于 2006-07-04 11:21:29 得分 0

现在是在A.h里#include   "B.h"  
                  B.h里class   A;  
                  B.cpp里#inclued   "A.h"  
  只有这样才行,如果把   #inclued   "A.h"   移到   B.h里就不行的  
   
  不管怎么样,总算行了,哈哈~~  
  再次感谢   m(_   _)m  
  Top

19 楼qhfu(改个名字)回复于 2006-07-04 12:51:48 得分 10

如果把#include   "A.h"放在   B.h中,又把#include   "B.h"放在   A.h中,那岂不是递归包含,所以只能一个用#include   一个用前置,或者两个都前置,前置的要求是,.h中不应该有对象声明   ,只能有指针声明,然后把定义放入cpp中,在cpp中包含这些头文件。Top

20 楼lizhanghui(拔刀术)回复于 2006-07-04 12:55:15 得分 0

怎么给不了分?????  
  说什么“贴子回复次数大于跟给分次数”  
  不懂弄了Top

相关问题

关键词

得分解答快速导航

  • 帖主:lizhanghui
  • sungengyu
  • wanderfox
  • qhfu
  • diandian82
  • qhfu
  • avril1986swj
  • al0n9
  • qhfu

相关链接

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

广告也精彩

反馈

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