[急求助]两个头文件里的#include的互相循环包含问题

btbq 2003-12-28 05:21:03
我做了两个类,但现在两个类都在功能的要求上一定要包含另一个类,我分别在两个类的头文件的#include里加入了另一个类,编译的时候就出现循环包含的致命错误了。请问怎么解决?#include命令有参数可以指定仅仅互相包含对方一次吗?
...全文
273 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
btbq 2003-12-28
  • 打赏
  • 举报
回复
问题已解决。
感谢
afantict(巴依老爷)提供事先声明的办法。55
感谢
jruv(江城飞鸿)接着提供具体代码。5

谢谢大家。
ahao 2003-12-28
  • 打赏
  • 举报
回复
有一个类只能放对方的指针或引用。再加上前置声明
yintongshun 2003-12-28
  • 打赏
  • 举报
回复
比如类A和B,可以在A.h中#include "B.h",然后在B.h中加上:Class A;就可以了
或者你把这两个类的头文件都在前面加上对方的声明也可以,不用包含头文件
btbq 2003-12-28
  • 打赏
  • 举报
回复
Re:hanwg()
“在类的h文件中加上宏定义
# ifndef _CLASSNAME_H_
#define _CLASSNAME_H_
...
#endif”

这里的意思是在...里填上我本来的代码吗?我这样做在编译的时候vc说我的类没有定义。不能互相使用。


Re broadoceans(broadoceans)
谢谢,把两个合在一起应该可以,不过我已经做了很多了,不想再大修改了。


事先声明的办法正在试验中...
jruv 2003-12-28
  • 打赏
  • 举报
回复
你可以添加一个类的声明:
//#include"duiwaiSocket.h" ---〉去掉此处
#if !defined(AFX_MYSOCKET_H__75FF2641_6F8B_4958_A8F6_346E1D11C31E__INCLUDED_)
#define AFX_MYSOCKET_H__75FF2641_6F8B_4958_A8F6_346E1D11C31E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MySocket.h : header file
///////////////////////////////////////////////////////////////////////////////
// CMySocket command target

class duiwaiSocket; //添加duiwaiSocket类的声明
class CMySocket : public CAsyncSocket
{
// Attributes
private://私有
CDialog* m_pWnd;//指向父对话框窗口的指针
duiwaiSocket* fuwuyuandizhi; // 此次我的服务员(duiwaiSocket),的指针

public:
....
}


//#include "MySocket.h" ---〉去掉此处
#if !defined(AFX_DUIWAISOCKET_H__17BFD46D_EC79_43E5_9E80_3405BC8DF494__INCLUDED_)
#define AFX_DUIWAISOCKET_H__17BFD46D_EC79_43E5_9E80_3405BC8DF494__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// duiwaiSocket.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// duiwaiSocket command target
class CMySocket; //添加CMySocket类的声明
class duiwaiSocket : public CAsyncSocket
{
// Attributes
private://私有
CDialog* m_pWnd;// 指向父对话框窗口的指针
CMySocket* renwuqingqiuzhedizhi; // 此次任务请求者(CMySocket)的地址指针
...
}



broadoceans 2003-12-28
  • 打赏
  • 举报
回复
可以将两个类的头文件合并为一个头文件即可。
或者采用楼上的条件编译。
afantict 2003-12-28
  • 打赏
  • 举报
回复
头文件互相包含肯定出错
http://expert.csdn.net/Expert/topic/2608/2608840.xml?temp=6.898135E-02
btbq 2003-12-28
  • 打赏
  • 举报
回复
我初学编的比较菜,高手不要笑我,两个类的基类都是CAsyncSocket。
第一个类:(这个类的头文件:MySocket.h)
#include"duiwaiSocket.h"

#if !defined(AFX_MYSOCKET_H__75FF2641_6F8B_4958_A8F6_346E1D11C31E__INCLUDED_)
#define AFX_MYSOCKET_H__75FF2641_6F8B_4958_A8F6_346E1D11C31E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MySocket.h : header file
//



/////////////////////////////////////////////////////////////////////////////
// CMySocket command target

class CMySocket : public CAsyncSocket
{
// Attributes
private://私有
CDialog* m_pWnd;//指向父对话框窗口的指针
duiwaiSocket* fuwuyuandizhi; // 此次我的服务员(duiwaiSocket),的指针

public:


// Operations
public:
CMySocket();
virtual ~CMySocket();

// Overrides
public:
void SetParent(CDialog* pWnd); // 记住父窗体地址
void jizhufuwuyuan(duiwaiSocket* pWnd); //记住服务员地址
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMySocket)
public:
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
virtual void OnAccept(int nErrorCode);
//}}AFX_VIRTUAL

// Generated message map functions
//{{AFX_MSG(CMySocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

// Implementation
/*protected:
virtual void OnAccept(int nErrorCode);*/
};



/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYSOCKET_H__75FF2641_6F8B_4958_A8F6_346E1D11C31E__INCLUDED_)


-------------------------------------
-------------------------------------

第另一个类 (这个类的头文件:duiwaiSocket.h)
#include "MySocket.h"

#if !defined(AFX_DUIWAISOCKET_H__17BFD46D_EC79_43E5_9E80_3405BC8DF494__INCLUDED_)
#define AFX_DUIWAISOCKET_H__17BFD46D_EC79_43E5_9E80_3405BC8DF494__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// duiwaiSocket.h : header file
//


/////////////////////////////////////////////////////////////////////////////
// duiwaiSocket command target

class duiwaiSocket : public CAsyncSocket
{
// Attributes
private://私有
CDialog* m_pWnd;// 指向父对话框窗口的指针
CMySocket* renwuqingqiuzhedizhi; // 此次任务请求者(CMySocket)的地址指针

// Operations
public:
void SetParent(CDialog* pWnd); // 用指针记住父对话框的函数
void jizhurenwuqingqiuzhe(CMySocket* pWnd); // 记住此次的任务请求者(CMySocket)的地址。
duiwaiSocket();
virtual ~duiwaiSocket();

// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(duiwaiSocket)
//}}AFX_VIRTUAL

// Generated message map functions
//{{AFX_MSG(duiwaiSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
virtual void duiwaiOnClose(int nErrorCode);
virtual void duiwaiOnConnect(int nErrorCode);
virtual void duiwaiOnReceive(int nErrorCode);
virtual void duiwaiOnSend(int nErrorCode);
virtual void duiwaiOnAccept(int nErrorCode);

// Implementation
protected:
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DUIWAISOCKET_H__17BFD46D_EC79_43E5_9E80_3405BC8DF494__INCLUDED_)

hanwg 2003-12-28
  • 打赏
  • 举报
回复
在类的h文件中加上宏定义
# ifndef _CLASSNAME_H_
#define _CLASSNAME_H_
...
#endif
jruv 2003-12-28
  • 打赏
  • 举报
回复
要看你是怎么写的了,一般情况下是可以相互包含的
把你的类贴出来看看先

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧