首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 两个类互相使用时,声明的有关问题

2012-03-01 
C++ 两个类互相使用时,声明的问题.-------------a.h------------#ifndefa_h#definea_h#includeiostream#

C++ 两个类互相使用时,声明的问题.
-------------a.h------------
#ifndef   a_h
#define   a_h

#include   <iostream>
#include   "b.h "

class   B;

class   A
{
public:
B   pB;
void   showGreeting();

};
#endif

----------a.cpp-----------------
#include   "a.h "

using   namespace   std;

void   A::showGreeting()
{
//this-> pB   =   NULL;
cout   < <   "this   is   class   A   ;   ) "   < <   endl;
}

-----------b.h------------------
#ifndef   b_h
#define   b_h

#include   <iostream>
#include   "a.h "

class   A;

class   B
{
public:
A   pA;
void   showGreeting();
};
#endif
-------------b.cpp-----------------
#include   "b.h "
using   namespace   std;

void   B::showGreeting()
{
//this-> pA   =   NULL;
cout   < <   "this   is   class   B   ;   ) "   < <   endl;
}
---------main.cpp-------------------
#include   <iostream>

#include   "a.h "
#include   "b.h "

using   namespace   std;

int   main(int   argc,   char**   argv)
{
A   a;
B   b;
cout   < <   "------info   of   class   A------ "   < <   endl;
a.showGreeting();
cout   < <   endl   < <   "------info   of   class   B------ "   < <   endl;
b.showGreeting();

return   0;
}
编译错误如下:
Compiling...
b.cpp
d:\vc   projects\test\testnew\a.h(12)   :   error   C2079:   'A::pB '   uses   undefined   class   'B '
a.cpp
d:\vc   projects\test\testnew\b.h(12)   :   error   C2079:   'B::pA '   uses   undefined   class   'A '
main.cpp
d:\vc   projects\test\testnew\b.h(12)   :   error   C2079:   'B::pA '   uses   undefined   class   'A '

A,B互相用到对方,   如上那样编译不通过啊.但是如下两种修改都能通过编译:
(1)A中的B和B中的A都改成指针形式.
(2)A中的B或者B中的A其中之一改成指针形式也好使.

请问高手这个是怎么回事呢?这类问题如何解决呢?谢谢!!

[解决办法]
你已经给出解决方法了
[解决办法]
关注...
好像是这样的,如果是pointer的话,编译的时候只要分配一个4字节的内存空间给这个类就OK了。如果两个都不是指针的时候,循环引用,最终肯定是编译不过。
希望高手给与讲解...
[解决办法]
用指针的时候,只要给个类声明就可以了,不用包含头文件。
而使用类的对像时,就要包含进相应类的头文件了,而这两个类要互相使用的话,那就是间接的包含了自己,在编译上有问题的哦。

看看用宏定义能不能解决了
#ifndef _MYHEADER
#define _MYHEADER
声明
#endif

或者是用pragma once看看。

没用过这种互相包含的,不知道能不能解决。

[解决办法]
设计本身就是有问题的
如果
A包含B
B包含A
除非A等价与B,否则不能成立

所以要用指针来间接的实现
[解决办法]
两个互相组合? 你想做什么? 还是纯理论的研究?
如果做理论研究麻烦问问你, 知道什么是递归吗?
------解决方案--------------------


我曾经也做过你那种,就是调用一个对话框,然后将前一个隐藏,用的QT,支持holyfire
[解决办法]
逻辑错误。
[解决办法]
这样用的话
B pB;
B需要定义
你可以改成指针就ok 了
[解决办法]
这种情况只能用指针了,引用也可以
[解决办法]
楼主已经给了解决方法了。
其实就是个鸡生蛋蛋生鸡的问题。
如果都是对象的话呢,就是A要由B的对象来生成,那么编译器就会去先生成个B出来,但是生成B的时候发现B需要由个A的对象生成,那么编译器就去努力生个A出来。。。。。。。。
就是成了个死循环。
如果一个为指针的话,那么就不用去生成某个对象了,就打破了这个循环了。
[解决办法]
只能是至少一个包含另一个的引用或指针,否则逻辑上是错误的。

热点排行
Bad Request.