有时候当头文件包含互相重叠时,可能会出现下面两个错误,而且成双成对出现(IDD_VIEW是我的对话框ID):
error C2065: 'IDD_VIEW' : undeclared identifier
error C2057: expected constant expression
解决办法是:在对话框类头文件中包含 #include "resource.h" 具体原因不知道什么
1:头文件重叠包含的问题
这样情况就仿照vc固有的方法(比如你的文件为test1.h,test1.cpp)
只需在test1.h里加入:
#ifndef test_H
#define test_H
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CTest
{
....
};
#endif
一切就ok
2:两个类相互包含的问题,类A里包含有类B的实例,而类B里包含有类A的实例
这种情况,你用指针就迎刃而解。
// A.h ///
#ifndef _A_H_
#define _A_H_
class B; // 声明一个空的B类,后边再进行具体声明和定义.
class B '; // 声明一个空的B '类,后边再进行具体声明和定义.
class A // A的声明,具体实现(implement)最好写在A.CPP中.
{
...
B *m_pB;
B ' *m_pB ';
...
};
#endif
// B.h ///
#ifndef _B_H_
#define _B_H_
#include "A.h "
class B // B的声明,具体实现(implement)最好写在B.CPP中.
{
...
A *m_pA;
...
};
#endif
// B '.h ///
#ifndef _B '_H_
#define _B '_H_
#include "A.h "
#include "B.h "
class B ':public B // B '的声明,具体实现(implement)最好写在B '.CPP中.
{
...
A *m_pA;
...
};
#endif
__________________________________________________
不过我个人认为,最好不要相互包含.
1. 你可以把两个.h文件合并成一个文件
2. 或者这样
(1)myclass1.h
#ifndef _MYLCASS1_H_
#define _MYLCASS1_H_
class myclass2;
class myclass1
{
};
#endif
(2) myclass2.h
#ifndef _MYCLASS2_H
#define _MYCLASS2_H
class myclass1;
class myclass2
{
};
#endif
_______________________________________________________________
//in MyEdit.h
class CMyDialog;
class CMyEdit:public CEdit
{
pubilc:
CMyEdit(CMyDialog *pDlg);
protected:
CMyDialog * m_pDlg;
..
}
//in MyEdit.cpp
#include "MyDialog.h "
...
//in MyDialog.h
#include "MyEdit.h "
class CMyDialog:public CDialog
{
protected:
CMyEdit m_editWnd;
}
其实我和 楼上的longyii(宁静.致远) 是一样的
这里我再罗嗦几句,
1)在一个类(如CMyEdit)的一个实例作为某个类的成员变量时,其container类
(如CMyDialog)就得知道该成员的内存布局,因此你就必须将CMyEdit的定义
告诉container,也就是在MyDialog.h中 #include "MyEdit.h "
2)而在MyEdit.h中,是一个指针CMyDialog *来作为CMyEdit的成员,因此,这里
只要你声明CMyDialog是一个class即可
3)而进一步,在MyEdit.cpp中,你会调用到CMyDialog的一些方法,这时就知道
CMyDialog的定义,因而有必要在MyEdit.cpp中#include "MyDialog.h "了