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

c++中如果有两个类A,B。A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量,可以吗?

楼主alice1982()2006-12-14 15:56:57 在 C/C++ / C++ 语言 提问

本来是java上的两个类,想将它们做成c++的,别的方面都还可以,就是出现这个问题,好像不认识其中一个类。该怎么办,谢谢 问题点数:20、回复次数:22Top

1 楼abblly(西边日出东边雨)回复于 2006-12-14 16:03:55 得分 0

A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量  
  ------------  
  改成指针  
  A定义时有一个B的指针作为成员变量,而B定义时有一个A的指针作为成员变量  
  Top

2 楼bobseadream(bobo)回复于 2006-12-14 16:15:26 得分 0

需要改成指针,否则会导致类之间的循环依赖  
  Top

3 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-12-14 16:18:33 得分 0

改成指针,java上本来就是指针。Top

4 楼oldliu(老刘)回复于 2006-12-14 16:25:22 得分 0

哪个类在前面,其包含的另一个类实例改为指针,这样就可以了,编译的时候它是指针编译器就知道可以到后面找它指向的类的定义了。。。Top

5 楼alice1982()回复于 2006-12-14 16:51:32 得分 0

那如果还有函数的返回类型,参数也是这样呢Top

6 楼xb_feng()回复于 2006-12-14 17:15:15 得分 0

class   A;  
   
  class   B  
  {  
        ...  
        A*   a_of_b;  
        ...  
  };  
   
  class   A  
  {  
        ...  
        B*   b_of_a;  
        ...  
  };Top

7 楼alice1982()回复于 2006-12-14 17:40:25 得分 0

class   B;  
  基本上是这样  
  class   A  
  {  
      B*   b;  
  public:  
  A(B*   b);  
      B*   hanshu();  
      void   hanshu2(B*   b);  
  }  
  class   B  
  {  
      A*   a;  
    public:  
  B(A*   a);  
      A   *   hanshu3();  
      void   hanshu4(A   *   *a);  
   
  }  
  编译时出错:missing   ';'   before   '*'  
  missing   storage-class   or   type   specifiers  
  identifier   'A'  
  identifier   'B'  
  unexpected   'class   A('  
  unexpected   token(s)   preceding   ';'  
  unexpected   'class   B('  
  unexpected   token(s)   preceding   ';'Top

8 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 17:51:01 得分 0

唉,类结束要用";"  
  class   B;  
   
  class   A  
  {  
      B*   b;  
  public:  
  A(B*   b);  
  B*   hanshu();  
  void   hanshu2(B*   b);  
  };  
  class   B  
  {  
  A*   a;  
  public:  
  B(A*   a);  
  A   *   hanshu3();  
  void   hanshu4(A   *   *a);  
   
  };Top

9 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 17:53:57 得分 0

那如果还有函数的返回类型,参数也是这样呢  
  ---------------------  
  不是,返回类型可以是指针、引用,也可以直接是类A或B  
  函数参数类型只能在定义后使用,因此得是指针或引用。  
  成员变量也只能是指针或引用。  
  Top

10 楼alice1982()回复于 2006-12-14 17:59:18 得分 0

to    
    lann64(昆仑大鹏@迦楼罗)    
  呵呵,忘了那个“;”,只是我用vc,那两个类分别有.h文件  
   
   
  说说关键的啊,为什么出错呢,我按照大家说的试过了啊  
  拜托Top

11 楼OOPhaisky(异化$渴望成功~~)回复于 2006-12-14 18:28:46 得分 0

c++中如果有两个类A,B。A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量,可以吗?    
  ------------------------------------------------------------------------------------  
  不可以,只能将一个改成指针。  
   
  你的程序写错了,少了两个分号,如下:  
  class   B;  
  class   A  
  {  
      B*   b;  
  public:  
  A(B*   b);  
      B*   hanshu();  
      void   hanshu2(B*   b);  
  };//此处少了一个分号  
  class   B  
  {  
      A*   a;  
    public:  
  B(A*   a);  
      A   *   hanshu3();  
      void   hanshu4(A   *   *a);  
   
  };//此处少了一个分号  
  Top

12 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 18:37:49 得分 0

说说关键的啊,为什么出错呢,我按照大家说的试过了啊  
  ----------------  
  没什么其他关键的了,换成指针,加上分号,编译没错了。Top

13 楼missilery(导弹专家)回复于 2006-12-14 19:44:16 得分 0

还是从设计的角度考虑吧  
  这不是循环依赖了么?Top

14 楼alice1982()回复于 2006-12-14 20:51:45 得分 0

确实按照大家说的有分号,把那几条语句写在一个cpp文件里编译可以通过。  
  可是我只是简写了那个类,他们分别有自己的头文件和cpp文件,我通过#   include   来声明这些类的。这样的情况下就是出现刚才那些错误。怎么办呢?Top

15 楼studyall123(不想当将军的士兵不是一名好士兵)回复于 2006-12-14 23:00:14 得分 0

markTop

16 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 23:12:06 得分 0

不知道你怎么写的头文件和cpp文件。Top

17 楼alice1982()回复于 2006-12-15 09:57:59 得分 0

#if   !defined(AFX_A_H__1594558E_B0D1_4D64_84F0_E6F5C9723961__INCLUDED_)  
  #define   AFX_A_H__1594558E_B0D1_4D64_84F0_E6F5C9723961__INCLUDED_  
   
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
  #include   "B.h"  
  class   A      
  {  
  public:  
  B   *b;  
  int   yposition;  
  public:  
  A();  
  virtual   ~A();  
  A(int   ypos);  
  void   setvanishingpoint(B   *b1);  
  B*   getvanishingpoint();  
  void   setbest(B*   b2);  
   
  };  
   
  #endif   //   !defined(AFX_A_H__1594558E_B0D1_4D64_84F0_E6F5C9723961__INCLUDED_)  
  #if   !defined(AFX_B_H__EC75EC99_DBE8_4FDE_AC83_4277ED27920A__INCLUDED_)  
  #define   AFX_B_H__EC75EC99_DBE8_4FDE_AC83_4277ED27920A__INCLUDED_  
   
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
  #include   "A.h"  
  class   B      
  {  
   
           
  public:  
    A   *a;  
  int   xposition;  
  B();  
  virtual   ~B();  
  B(int   ypos);  
  void   setvanishingpoint(A   *a1);  
  A*   getvanishingpoint();  
  void   setbest(A*   a2);  
   
  };  
   
  #endif   //   !defined(AFX_B_H__EC75EC99_DBE8_4FDE_AC83_4277ED27920A__INCLUDED_)  
  A::A()  
  {  
   
  }  
   
  A::~A()  
  {  
   
  }  
  A::A(int   ypos)  
  {  
  yposition=ypos;  
  b=NULL;  
   
  }  
  void   A::setvanishingpoint(B   *b1)  
  {  
  b=b1;  
  }  
  B*   A::getvanishingpoint()  
  {  
  return   b;  
  }  
  void   A::setbest(B*   b2)  
  {  
  yposition=b2->xposition;  
  }  
   
   
   
  B::B()  
  {  
   
  }  
   
  B::~B()  
  {  
   
  }  
  B::B(int   xpos)  
  {  
  xposition=xpos;  
  a=NULL;  
   
  }  
  void   B::setvanishingpoint(A   *a1)  
  {  
  a=a1;  
  }  
  A*   B::getvanishingpoint()  
  {  
  return   a;  
  }  
  void   B::setbest(A*   a2)  
  {  
  xposition=a2->yposition;  
  }  
  先不要管这两个类的相似性(函数什么的都一样),就是那个意思,如果它能通过了,我的那些完整的类也应该可以吧  
   
   
  A.cpp  
  e:\练习\tiwen\b.h(17)   :   error   C2143:   syntax   error   :   missing   ';'   before   '*'  
  e:\练习\tiwen\b.h(17)   :   error   C2501:   'A'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\b.h(17)   :   error   C2501:   'a'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\b.h(22)   :   error   C2061:   syntax   error   :   identifier   'A'  
  e:\练习\tiwen\b.h(23)   :   error   C2143:   syntax   error   :   missing   ';'   before   '*'  
  e:\练习\tiwen\b.h(23)   :   error   C2501:   'A'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\b.h(23)   :   error   C2501:   'getvanishingpoint'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\b.h(24)   :   error   C2061:   syntax   error   :   identifier   'A'  
  B.cpp  
  e:\练习\tiwen\a.h(15)   :   error   C2143:   syntax   error   :   missing   ';'   before   '*'  
  e:\练习\tiwen\a.h(15)   :   error   C2501:   'B'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\a.h(15)   :   error   C2501:   'b'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\a.h(21)   :   error   C2061:   syntax   error   :   identifier   'B'  
  e:\练习\tiwen\a.h(22)   :   error   C2143:   syntax   error   :   missing   ';'   before   '*'  
  e:\练习\tiwen\a.h(22)   :   error   C2501:   'B'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\a.h(22)   :   error   C2501:   'getvanishingpoint'   :   missing   storage-class   or   type   specifiers  
  e:\练习\tiwen\a.h(23)   :   error   C2061:   syntax   error   :   identifier   'B'  
  Generating   Code...  
  Error   executing   cl.exe.  
  Top

18 楼boys2008nian(飞雪)回复于 2006-12-15 11:48:38 得分 0

c++中如果有两个类A,B。A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量,可以吗?    
  ------------------------------------------------------------------------------------  
  不可以,只能将一个改成指针或者引用  
  因为  
  这个类还没有定义  
  你只知道类型,不能申请类对象空间  
  所以就更不能第一类对象了Top

19 楼dadi0189(冰雨)回复于 2006-12-15 12:16:07 得分 0

对用到的类进行声明,然后用指针或引用去定议成员变量.Top

20 楼zengkun100(夜的孩子)回复于 2006-12-15 15:16:00 得分 0

循环依赖!  
  而且要定义成员变量,就必须知道对象的大小,所以在类的完整定义出现以前是没有办法定义对象的,因为不知道应该分配多少内寸,所以上面说的指针是正解。Top

21 楼H_Bai(小白)回复于 2006-12-15 15:29:40 得分 0

改成指针,java上本来就是指针。  
   
  JAVA还用指针???  
  C++里面用指针还可以,JAVA用要出错  
  Top

22 楼xu_yuanjie()回复于 2006-12-15 16:53:48 得分 0

markTop

相关问题

关键词

得分解答快速导航

  • 帖主:alice1982

相关链接

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

广告也精彩

反馈

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