⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_15297.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:15297 发表者:zmp 发表日期:2002-09-17 11:46:04
<br>主题:当两个类互相包含,编译就通不过, 怎么办?
<br>内容:举个简单的例子,定义两个类:CA和CB。 定义如下:<BR><BR>#include "A.h"<BR>class CB&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CB();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CA m_a;<BR>}<BR><BR><BR>#include "B.h"<BR>class CA&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CA();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CA();<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB m_b;<BR>}<BR><BR>这两个类都有对方类的一个对象实例,那在这两个类都要包含另一个类的头文件。<BR><BR>可是这样因为互相包含,编译永远通不过。 除了把两个类放到同一个文件里,是否还有什么<BR><BR>解决方法?<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:doggo 回复日期:2002-09-17 11:51:32
<br>内容:写成如下形式:<BR>#include "A.h"<BR>class CB&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CB();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CA m_a;<BR>}<BR><BR><BR>#include "B.h"<BR>class CB;<BR>class CA&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CA();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CA();<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB m_b;<BR>}<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-09-17 12:24:10
<br>内容:#if !defined __CLASSA<BR>#define __CLASSA<BR>&nbsp;&nbsp;...<BR>&nbsp;&nbsp;...<BR>#endif<BR><BR>将.h文件中的内容用上面形式的预编译命令包起来,就可以避免重复定义了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zmp 回复日期:2002-09-17 14:04:50
<br>内容:谢谢! 但是上面的两个方法都没有用啊, 还是编译出错。 大家帮忙啊!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-09-17 14:44:24
<br>内容:两个一起试试,肯定可以,要不就是你其它哪里出错了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zmp 回复日期:2002-09-17 14:56:28
<br>内容:我是在两个类里都加了#if !defined __CLASSA。。。 啊。。 但是真的没用。 不信你试试。<BR><BR>具体定义如下:<BR><BR>A.h:<BR><BR>#if !defined(AFX_A_H__B88F3956_F818_4DBD_B168_20BB6A1D4893__INCLUDED_)<BR>#define AFX_A_H__B88F3956_F818_4DBD_B168_20BB6A1D4893__INCLUDED_<BR><BR>#if _MSC_VER &gt; 1000<BR>#pragma once<BR>#endif // _MSC_VER &gt; 1000<BR><BR>#include "B.h"<BR><BR>#if !defined __CLASSA<BR>#define __CLASSA<BR><BR>class CA&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CA();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CA();<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB m_b;<BR>};<BR><BR>#endif<BR><BR>#endif // !defined(AFX_A_H__B88F3956_F818_4DBD_B168_20BB6A1D4893__INCLUDED_)<BR><BR><BR>B.h:<BR><BR>#if !defined(AFX_B_H__5833E86B_F718_42EA_A405_D795FC642ECE__INCLUDED_)<BR>#define AFX_B_H__5833E86B_F718_42EA_A405_D795FC642ECE__INCLUDED_<BR><BR>#if _MSC_VER &gt; 1000<BR>#pragma once<BR>#endif // _MSC_VER &gt; 1000<BR><BR>#include "A.h"<BR><BR>#if !defined __CLASSB<BR>#define __CLASSB<BR><BR>&nbsp;&nbsp;<BR>class CB&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CB();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CA m_a;<BR><BR>};<BR><BR>#endif<BR><BR>#endif // !defined(AFX_B_H__5833E86B_F718_42EA_A405_D795FC642ECE__INCLUDED_)<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-09-17 15:38:20
<br>内容:你的类是用ClassWizard生成的,它自动加入了下列行。<BR>#if !defined(AFX_B_H__5833E86B_F718_42EA_A405_D795FC642ECE__INCLUDED_)<BR>#define AFX_B_H__5833E86B_F718_42EA_A405_D795FC642ECE__INCLUDED_<BR><BR><BR>你可以将<BR>#if !defined __CLASSB<BR>#define __CLASSB<BR>#endif<BR>去掉,它和上面的作用是一样的。<BR><BR>你的代码我试过了,用VC6可以编译过去。问题不是在类的定义上。要不你把整个工程贴上来吧。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:xiongli 回复日期:2002-09-17 17:12:32
<br>内容:问题不在这里<BR>你犯了两个错误<BR>1,最开始的编译错误不是因为类的包含,而是因为include,你的a.h b.h互相包含,最后导致包含次数太多而错误<BR><BR>2,根本不可能存在两个类互相包含对方的实体,最多能够包含对方的指针。但是如果你在构造函数中用包含的指针互相生成对方的实体,也会错误,我马上会解释<BR><BR>3,在语法上,要互相包含对方的指针是可以的,因在这样:<BR><BR>//example1<BR>// a.h<BR>class CB;<BR>class CA&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB *m_b;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CA();<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CA(){};&nbsp;&nbsp;&nbsp;&nbsp;<BR>};<BR><BR>class CB&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CA *m_a;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB();&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CB(){};<BR>};<BR>这样编译肯定没有问题,如果你分成两个文件,也只需要在其中一个文件里面去掉include 用:<BR>//example2<BR>//a.h<BR>class CB;<BR>class CA&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB *m_b;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CA(){};<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CA(){};&nbsp;&nbsp;&nbsp;&nbsp;<BR>};<BR><BR>//b.h<BR>#include "a.h"<BR>class CB&nbsp;&nbsp;<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CA *m_a;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CB(){};&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CB(){};<BR>};<BR><BR>//main.cpp<BR>#include "b.h"<BR>int main()<BR>{<BR>CA x;<BR>return 0;<BR>}<BR><BR>4,然后让我来解释为什么不能互相包含对方的实体<BR>做个实验:如果你的类定义放在同一个文件里面, 如example1,然后你在类的构造函数里面分别加上m_a=new CA();&nbsp;&nbsp;m_b=new CB();<BR>然后你编译可以通过,但是当你运行的时候呢,当CA x;运行,那么先调用a构造函数,然后是b的构造函数,然后又是b的构造函数,然后又是a的构造函数......无完无了,直到内存没有。所以,你一辈子也不可能遇上类互相包含对方实体的情况!<BR>或者你想一想,就算你成功了,sizeof(CA);是多少??如果你成功了,你是不是可以这样调用a.b.a.b.a.b.a.b...................因为他们是互相包含的阿!!<BR>所以你的问题问错<BR><BR>不知道我解释对不对??<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zmp 回复日期:2002-09-17 17:54:34
<br>内容:凯凯同志,用那个条件预编译真的不行啊。 我不知道你为什么可以编译通过。你可以把你编译通过的项目代码发到我的邮箱zhangmeiping@163.com。&nbsp;&nbsp;xiongli同志分析得简明透彻, 说得很对,确实不可能互相包含对方的实体。&nbsp;&nbsp;我的项目中也不是互相包含实体,而是其中一个包含另一个的实体,另一个包含对方的指针。 用xiongli的方法编译通过, 谢谢! 谢谢大家! 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-09-17 19:17:46
<br>内容:不好意思,是我搞错了。只加入申明时编译没出错。当我试着申明一外CA或CB的变量时就出错了。汗颜。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zmp 回复日期:2002-09-19 09:37:04
<br>内容:在做项目中发现新的问题:<BR><BR>在xiongli的例子里,在a.h中,class CB是用class CB;这一行来声名的, 而不是用include。 如果在class CA的成员函数中使用了成员m_b,比如在CA::ddd()这个函数里写了: m_b-&gt;eee();&nbsp;&nbsp;(&nbsp;&nbsp;eee()是class CB的一个成员函数)。&nbsp;&nbsp;那在a.cpp里必须写上#include "b.h"。&nbsp;&nbsp;否则编译通不过。&nbsp;&nbsp; 而b.cpp里不需要的,因为b.h里已经include了a.h了。<BR><BR>大家可以试试。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -