我从CButton类派生了一个自绘按钮类CBtmpbutton,但是在CBtmpbutton中增加一个CPCBView* m_pview成员变量出错信息如下:
:\downloads\读写hid设备步骤\键盘pcb测试程序\btmpbutton.h(37) : error C2143: syntax error : missing ';' before '*'
e:\downloads\读写hid设备步骤\键盘pcb测试程序\btmpbutton.h(37) : error C2501: 'CPCBView' : missing storage-class or type specifiers
e:\downloads\读写hid设备步骤\键盘pcb测试程序\btmpbutton.h(37) : error C2501: 'm_pview' : missing storage-class or type specifiers
执行 cl.exe 时出错.
Creating browse info file...键盘PCB测试程序.exe - 1 error(s), 0 warning(s)我在btmpbutton.h中增加#include "键盘PCB测试程序View.h":
//#include "stdafx.h"
//#include "键盘PCB测试程序.h"
#include "键盘PCB测试程序View.h"
//#include "键盘PCB测试程序Doc.h"
class CBtmpbutton : public CButtonBtmpbutton.cpp
e:\downloads\读写hid设备步骤\键盘pcb测试程序\键盘pcb测试程序view.h(22) : error C2143: syntax error : missing ';' before '*'
e:\downloads\读写hid设备步骤\键盘pcb测试程序\键盘pcb测试程序view.h(22) : error C2501: 'CPCBDoc' : missing storage-class or type specifiers
e:\downloads\读写hid设备步骤\键盘pcb测试程序\键盘pcb测试程序view.h(22) : error C2501: 'GetDocument' : missing storage-class or type specifiers
执行 cl.exe 时出错.
Creating browse info file...键盘PCB测试程序.exe - 1 error(s), 0 warning
谁能讲讲为什么会这样,该怎样解决?

解决方案 »

  1.   

    btmpbutton.h 不要 #include "键盘PCB测试程序View.h", 更不要include xxdoc.h只要在开头加上 class CPCBView;就可以了。!include几句,加到 btmpbutton.cpp里面去。
      

  2.   

    doc.h要在view.h前面包含。#include "键盘PCB测试程序Doc.h" 
    #include "键盘PCB测试程序View.h" 
      

  3.   

    #include "键盘PCB测试程序Doc.h" 
    先包含Doc.h,vc6的编译器有这个bug.
      

  4.   

    主要去查CPCBView 类包含的文件;可能是没有包含 CPCBView.h 头文件,在你定义的自绘类中!
      

  5.   

    感谢楼上的提示指导,我在从CButton类派生的自绘按钮类CBtmpbutton头文件中的CBtmpbutton类定义前加上class CPCBView;这个前向声明,再在CBtmpbutton类的实现文件中的开始位置添加了以下头文件包含
    #include "stdafx.h" 
    #include "键盘PCB测试程序.h" 
    #include "MainFrame.h"
    #include "键盘PCB测试程序Doc.h" 
    #include "键盘PCB测试程序View.h"
    ......
    然后编译连接都通过了,但是运行时出错,于是跟踪一下发现:程序运行到CBtmpbutton类的构造函数中的
    m_pview = (CPCBView*)(((CFrameWnd*)(AfxGetApp()->GetMainWnd()))->GetActiveView()); 出错。
    于是将这条长语句拆分成以下语句后查看相关指针值:CPCBApp * papp = (CPCBApp *)AfxGetApp();
    CFrameWnd* pmfr = (CFrameWnd*)(papp->GetMainWnd());
    m_pview = (CPCBView*)(pmfr->GetActiveView()); 
    发现papp里有值, pmfr里是0X00000000h,也就是pmfr值为空,即找不到主窗口对象指针,再继续跟踪运行即报运行时错误了。
    而同样是这条语句m_pview = (CPCBView*)(((CFrameWnd*)(AfxGetApp()->GetMainWnd()))->GetActiveView()); 
    我在这个程式没有添加CBtmpbutton类这部分功能的时候在CAboutDlg类中也添加了一个成员变量CPCBView* m_pview,也用这条语句在CAboutDlg类的构造函数进行初始化赋值,没有问题,我还在CAboutDlg类的其它函数中用这个m_pview访问了CPCBView类的公有变量,并显示在了关于对话框的EDIT控件中了的,为什么在自定义的类中就无法取得CFrameWnd* pmfr呢???
    我注意到了,CAboutDlg类是定义在 “键盘PCB测试程序.h”中的,而程序全局变量CPCBApp TheApp;和CAboutDlg()构造函数也是在“键盘PCB测试程序.cpp”中的,那么在自定义的CBtmpbutton类中使用AfxGetApp();能正确地得到TheApp对象的地址指针吗?如果正确地得到TheApp对象的地址指针,为什么得不到正确CFrameWnd* pmfr???,也注意到了:“Btmpbutton.cpp”中所包含的头文件几乎和“键盘PCB测试程序.cpp”中所包含的头文件一模一样,那编译器编译连接通过,编译器能区分一个工程中那一个.cpp文件是程序的入口文件吗(如果能区分是靠检测程序中的WinMain()函数区分吗?),会不会是不能区分程序的入口.cpp这个原因造成运行时错误的?本来在自定义的类中定义CPCBView* m_pview然后在类中利用m_pview访问CPCBView类的公有变量,不利于自定义类(Button控件)的封装,网上也基本搜不到这种使用例子,但是如果一定想要在自定义类中象在关于对话框类CAboutDlg中这样访问CPCBView或CFrameWnd或CPCBDoc类的公有变量,能不能做到?不能做到是为什么?有啥变通的好的做法?
    请大虾们谈谈,指导指导!!!
      

  6.   

    >> m_pview = (CPCBView*)(((CFrameWnd*)(AfxGetApp()->GetMainWnd()))->GetActiveView()); 出错。如果你的CBtmpbutton 是 mainframe的成员,则会出现这种情况。 原因是在构造函数运行时,mainframe并没有初始化完成。只有等他的所有成员的构造函数完成了,mainframe才完成构造函数。mainframe没有构造完成,更不可能创建窗口。GetMainWnd() 是要等到 mainframe 构成完成,并且 create创建窗口完成 才有值的。因此这条语句不能放在构造函数这儿执行。可以给CBtmpbutton添加一条初始化函数 如 void SetMyView(CView* pView);在 MainFrame的OnCreate, 或者 OnCreateClient里,执行 CBtmpbutton::SetMyView(AfxGetMainWnd());来初始化他。