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出来。。。。。。。。
就是成了个死循环。
如果一个为指针的话,那么就不用去生成某个对象了,就打破了这个循环了。
[解决办法]
只能是至少一个包含另一个的引用或指针,否则逻辑上是错误的。