这是VC的bug吗?

hnzlk 2009-09-09 10:25:22
用vs2005新建一单文档工程A,然后在Mainfrm.cpp中添加AView.h,然后编译,就会出错。网上说:可能是头文件顺序引起的,一种解决方法是将出错的地方注释,编译,再去掉注释,再编译就行。但后来,改了代码,重新编译的时候,又出同样的错,很郁闷。

以前没用过vc,还想问一个问题,我看别的编译器将头文件一般放在.h中,在mfc中一般放在.cpp中,那么你用其它类的时候,比如要在.h中定义一个类对象,难道不用在.h中包含相关类的头文件吗?这个在头文件中包含,又在.cpp中包含,感觉挺混乱的。所以,大家说说,你们一般是怎么做的。

我的工程是在mainfrm中分割两个视图窗口。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rt;
GetClientRect(rt);
if(m_splitter.CreateStatic(this,1,2)==NULL)
return false;
m_splitter.CreateView(0,0,RUNTIME_CLASS(CDrawBorderView),CSize(rt.Width()-200,rt.Height()), pContext);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CFormTreeView),CSize(200,rt.Height()), pContext);
return true;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}

这样的话,肯定要包含CDrawBorderView,CFormTreeView两个类的头文件吧。如何解决啊,各位!很困惑!
...全文
169 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
webing520 2009-09-09
  • 打赏
  • 举报
回复
貌似楼主的代码是VC6移植到2005的么?
webing520 2009-09-09
  • 打赏
  • 举报
回复
//要不按照如下的试试
//CMainFrame* pMF=(CMainFrame*)AfxGetMainWnd(); 改成如下:
CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd;
hnzlk 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gordon3000 的回复:]
尽量在cpp文件里面包含,不到万不得已不要在头文件里面包含头文件。
你这个问题有点特殊,一般View的头文件都有GetDocument在里面,所以会出错。解决的办法是先把Doc的头文件包含进去,然后再包含view的头文件。

[/Quote]
我刚刚也试着把doc的头文件包进去,还真的可以。你说尽量不要在头文件中包含其它头文件,那你要定义一个别的类对象怎么办?
muzizongheng 2009-09-09
  • 打赏
  • 举报
回复
你在drawborderview.h的类定义前面 加上 


class CMainFrame;

class CDrawBorderView: public CView

..

{
yuhudie203 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hnzlk 的回复:]
引用 10 楼 feilinhe 的回复:
这不是VC的BUG
你在哪里用到相应的别的类的东西
你就可以在哪包含,.h或.cpp中都可以

你的这个应该包含
#include "DrawBorderView.h"
#include "FormTreeView.h"


我肯定包含了啊。
但我要在一个视图类中调用另一个视图类的函数。所以我要在一个视图类中包含mainfrm.h以取得另一个类的指针。
CMainFrame* pMF=(CMainFrame*)AfxGetMainWnd();

        CDrawBorderView* BorderView=(CDrawBorderView*)pMF->m_splitter.GetPane(0,0);


错误如下:
d:\vs2005\test\drawborder\drawborderview.h(17) : error C2143: 语法错误 : 缺少“;”(在“*”的前面)
d:\vs2005\test\drawborder\drawborderview.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
d:\vs2005\test\drawborder\drawborderview.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
[/Quote]
这个也是头文件包含顺序的问题导致的 具体得看代码
副组长 2009-09-09
  • 打赏
  • 举报
回复
尽量在cpp文件里面包含,不到万不得已不要在头文件里面包含头文件。
你这个问题有点特殊,一般View的头文件都有GetDocument在里面,所以会出错。解决的办法是先把Doc的头文件包含进去,然后再包含view的头文件。
hnzlk 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 feilinhe 的回复:]
这不是VC的BUG
你在哪里用到相应的别的类的东西
你就可以在哪包含,.h或.cpp中都可以

你的这个应该包含
#include "DrawBorderView.h"
#include "FormTreeView.h"
[/Quote]

我肯定包含了啊。
但我要在一个视图类中调用另一个视图类的函数。所以我要在一个视图类中包含mainfrm.h以取得另一个类的指针。
CMainFrame* pMF=(CMainFrame*)AfxGetMainWnd();

CDrawBorderView* BorderView=(CDrawBorderView*)pMF->m_splitter.GetPane(0,0);


错误如下:
d:\vs2005\test\drawborder\drawborderview.h(17) : error C2143: 语法错误 : 缺少“;”(在“*”的前面)
d:\vs2005\test\drawborder\drawborderview.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
d:\vs2005\test\drawborder\drawborderview.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
yuhudie203 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hnzlk 的回复:]
引用 3 楼 yuhudie203 的回复:
在Cpp里也可以包含,但是容易引起头文件重复包含的问题,你可能以上两个头文件包含在staafx.h之前所导致的

你可以试试倒一下需要包含头文件的位置

最保险的是包含在mainfrm.h中

包在头文件中也是不行的。你可以试一个最简单的例子,建一单文件档mfc程序,然后把view.h包含在mainfrm.cpp中,或者包含在.h中,看看会不会出错。
[/Quote]
楼主啊~~ 你这样说我才理解了你的愿意啊 怎么能把单文档视图的view.h包含在头文件里呢 本身是可以编译通过的 这样包含肯定会出错,

你不是要切分窗口么,把你要显示上去的而并非主视图的那个.h文件包含在mainfrm.h里

不知道你理解意思不
心留 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yuhudie203 的回复:]
在Cpp里也可以包含,但是容易引起头文件重复包含的问题,你可能以上两个头文件包含在staafx.h之前所导致的

你可以试试倒一下需要包含头文件的位置

最保险的是包含在mainfrm.h中
[/Quote]

同意
feilinhe 2009-09-09
  • 打赏
  • 举报
回复
这不是VC的BUG
你在哪里用到相应的别的类的东西
你就可以在哪包含,.h或.cpp中都可以

你的这个应该包含
#include "DrawBorderView.h"
#include "FormTreeView.h"
muzizongheng 2009-09-09
  • 打赏
  • 举报
回复
我的方法 ,楼主试了? 编译错误, 给出代码
hnzlk 2009-09-09
  • 打赏
  • 举报
回复
谁能详细说明一下。
我辣椒哥 2009-09-09
  • 打赏
  • 举报
回复
不是vc的BUG
hnzlk 2009-09-09
  • 打赏
  • 举报
回复
顶。
hnzlk 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yuhudie203 的回复:]
在Cpp里也可以包含,但是容易引起头文件重复包含的问题,你可能以上两个头文件包含在staafx.h之前所导致的

你可以试试倒一下需要包含头文件的位置

最保险的是包含在mainfrm.h中
[/Quote]
包在头文件中也是不行的。你可以试一个最简单的例子,建一单文件档mfc程序,然后把view.h包含在mainfrm.cpp中,或者包含在.h中,看看会不会出错。
muzizongheng 2009-09-09
  • 打赏
  • 举报
回复
一般不要怀疑是vs的bug. 呵呵.
yuhudie203 2009-09-09
  • 打赏
  • 举报
回复
在Cpp里也可以包含,但是容易引起头文件重复包含的问题,你可能以上两个头文件包含在staafx.h之前所导致的

你可以试试倒一下需要包含头文件的位置

最保险的是包含在mainfrm.h中
muzizongheng 2009-09-09
  • 打赏
  • 举报
回复
在Cpp中include 这2个类的头文件,

如果你2个类的头文件也包含了cmainframe的头文件, 请在2个类的类定义前面加上:

class CMainFrame;

yuhudie203 2009-09-09
  • 打赏
  • 举报
回复
在Mainfrm.h中包含
#include DrawBorderView.h
#include FormTreeView.h
T252808882 2009-09-09
  • 打赏
  • 举报
回复
学习。。
加载更多回复(1)
version :4.0 1、将生成的代码和事件用两个文件实现。 2、修改了部分Bug; 3、颜色设置做了部分改进; 4、内部集成了VC的编译器,和模拟器,生成C文件后可以直接在uCGUIBuilder中编译,运行模拟器了 5、添加代码自动完成功能; 6、添加画线功能。 version : 3.1.0.0 1、修改了选择不同窗体属性窗口不更新的BUG; 2、修改了只能打开一个ucGUIBuilder的功能,现在可以同时启动多个; 3、修复了拖放非ucfrm引起软件错误的Bug; 4、添加了控件ID自动增加功能; 5、添加了控件ID检查功能,控件ID有重复时会有警告; 6、添加了用户自定义字体功能; 7、支持中英文切换(但功能不够完善); 8、支持自动检查更新; 9、修改了不能保存用户自定义ID的BUG; version : 3.0.0.0 重写了部分内核,运行更稳定; 支持窗体设计器的复制、粘贴、剪切、删除、撤销、等基本操作; 支持多控件,对齐、公共属性修改等基本操作; 支持将.ucfrm文件与ucGUIBuilder关联功能; 支持控件自定义ID; 添加了窗体预览功能; 添加了对控件事件的支持; 添加了在线检查更新功能; 等…… version : 2.1.0.5 优化了控件库; 修复了一些Bug; 代码生成窗口中添加了C语言语法高亮显示功能; C文件模板做了部分修改(C文件模板大家可以随意修改为自己喜欢的格式(..\Template\Template.c文件) 但是要保证$$$GUI_WIDGET_CREATE_INFO$$$ $$$Defination$$$ $$$InitDialog$$$ 三个字符串位置不变) 支持设计的窗体保存为文件,并可以打开; 对所有控件属性添加了Description(在属性窗口最下面显示); 窗体布局可以保存,可以自定义为自己喜欢的窗体布局; 修改了部分功能; version : 2.0.0.5 优化了控件库; 修复了一些Bug; 可以生成完整的C文件(包括 资源表,初始化代码等); 修改了部分功能; version : 1.0.0.0 功能很不完善; 还有好多BUG; 目前只能生成资源表; 暂时不能生成其他代码; 大家有什么好的建议可以发送Email 到: ucguibuilder@163.com

16,550

社区成员

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

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

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