小弟最近被这个问题搞的很苦恼啊,我建了个基于对话框的MFC程序,生成了一个CWriteHahaDlg类,我自己定义了一个名为CComm的一个类。现在我要做如下的操作:
1)在CWriteHahaDlg 类中声明一个CComm (或CComm*)类型的成员变量。
2)在CWriteHahaDlg 的初始化的函数中生成一个CComm 的一个对象,然后用这个去初始化 CComm(或CComm*)类型的成员变量,从而可以让CComm处理一些事,CWriteHahaDlg完成界面。
3)在自定义的CComm类中,我想在他的某个方法中对CWriteHahaDlg 中的控件进行操作。 现在小弟的问题就是,我在CComm 类中声明一个CWriteHahaDlg的对象或者它的指针作为成员变量的时候不行(想用这个声明的成员变量来调用CWriteHahaDlg的函数操作控件),不知带这种思路有没有错,如果没有错怎么在声明的时候报错了,有错的话希望各位大侠出手帮帮忙,将感激不尽
//Comm.h
private:
CWriteHahaDlg m_Dlg;//错误指向这行 错误代码:
error C2146: syntax error : missing ';' before identifier 'm_Dlg'
f:\c++\writehaha\comm.h(31) : error C2501: 'CWriteHahaDlg' : missing storage-class or type specifiers
f:\c++\writehaha\comm.h(31) : error C2501: 'm_Dlg' : missing storage-class or type specifiers
1)在CWriteHahaDlg 类中声明一个CComm (或CComm*)类型的成员变量。
2)在CWriteHahaDlg 的初始化的函数中生成一个CComm 的一个对象,然后用这个去初始化 CComm(或CComm*)类型的成员变量,从而可以让CComm处理一些事,CWriteHahaDlg完成界面。
3)在自定义的CComm类中,我想在他的某个方法中对CWriteHahaDlg 中的控件进行操作。 现在小弟的问题就是,我在CComm 类中声明一个CWriteHahaDlg的对象或者它的指针作为成员变量的时候不行(想用这个声明的成员变量来调用CWriteHahaDlg的函数操作控件),不知带这种思路有没有错,如果没有错怎么在声明的时候报错了,有错的话希望各位大侠出手帮帮忙,将感激不尽
//Comm.h
private:
CWriteHahaDlg m_Dlg;//错误指向这行 错误代码:
error C2146: syntax error : missing ';' before identifier 'm_Dlg'
f:\c++\writehaha\comm.h(31) : error C2501: 'CWriteHahaDlg' : missing storage-class or type specifiers
f:\c++\writehaha\comm.h(31) : error C2501: 'm_Dlg' : missing storage-class or type specifiers
================
给CComm类改一下构造函数,通过构造函数将CWriteHahaDlg的对象指针传进来就行了。
谢谢了,给讲讲呗!
// CxxxxDlg* m_pParentDlg;
CComm::SetParent(CDialog *pParent)
{
m_pParentDlg=(CxxxxDlg*)pParent;
}
在CComm.h中声明CWnd* m_pParent;
在CComm.cpp中#include"CWriteHahaDlg.h",
写构造函数:
CComm::CComm(CWnd* pParent)
{
m_pParent=pParent;
}
在需要用到CWriteHahaDlg 的地方转一下就行了:
(CWriteHahaDlg *)m_pParent;
在CWriteHahaDlg对CComm初始化是把自己的句柄赋给他
这样一些简单的操作可以通过句柄完成
复杂一下的就发个自定义消息出来让CWriteHahaDlg去完成
这个我明白,就是用这个对象的指针来调它的函数对吧,但是我有个疑问就是当我把构造函数改成
头文件改成CComm(CWriteHahaDlg* pdlg)的时候出现错误了 error C2629: unexpected 'class CComm (' 再在CWriteHahaDlg的初始化函数中怎么给这个构造传this指针么,还是有什么方法可以获得CWriteHahaDlg的指针?
=====================
将CComm的构造函数改成:
CComm::Comm(CWriteHahaDlg *pDlg)
{
m_pDlg=pDlg;//m_pDlg是CComm的一个CWriteHahaDlg *型的成员变量,用来保存传过来的指针的。}
然后在CWriteHahaDlg中引用CComm类时写成这样:
CComm comm(this);就行了。
class CCom
{
public:
CCom(CWriteHahaDlg* pDlg)
{}
};CWriteHahaDlg::CWriteHahaDlg()
{
_com = new CCom(this);
}
#include "WriteHaha.h"//CWriteHahaApp的头文件
#include "WriteHahaDlg.h"class CComm
{
public: CComm(CWriteHahaDlg * dlg);//这行报错了,错误为unexpected 'class CComm ('
bool Listen(int PortNum);
bool SendMsg(char *Msg, int Len, char *host, short port);
virtual ~CComm();private:
CWriteHahaDlg *m_Dlg;//这行报错 , error C2143: syntax error : missing ';' before '*'}求解释啊
应该是头文件相互包含引起的。
#include "WriteHaha.h"//CWriteHahaApp的头文件
#include "WriteHahaDlg.h"
以上两行移到到CComm.cpp文件中;
在原位置写如下代码:
class CWriteHahaDlg;
http://hi.baidu.com/shilyx/blog/item/c1e3f7f277e29811b17ec5f2.html
可以帮助理解头文件互相包含引发的问题。