📄 subject_61919.htm
字号:
<p>
序号:61919 发表者:lixiaofei 发表日期:2003-11-23 10:29:36
<br>主题:请教各位高手:为什么在VC.net中这句话throw new CException;通不过?
<br>内容:这是书中的源代码,在VC6+XP下通过<BR>VC.net中出错提示为: f:\图形图像\ch08\demo_viewdib\cdib.cpp(438): error C2259: “CException” : 不能实例化抽象类<BR><BR>/////////////////////////////////////////////<BR>//这个函数从文件中将DIB读进CDib对象中,文件<BR>//被成功的打开。<BR>//参数<BR>//pFile:指向包含DIB文件的指针<BR>////////////////////////////////////////////<BR>BOOL CDib::ReadFile(CFile* pFile)<BR>{<BR> //读文件头得到BITMAPINFOHEADER和颜色表的大小<BR> //读BITMAPINFOHEADER得到图像小、尺寸和颜色表<BR> //读取图像信息<BR> InitDestroy();<BR> int counts, size;<BR> BITMAPFILEHEADER bmfh;<BR> try {<BR> counts = pFile->Read((LPVOID) &bmfh, <BR> sizeof(BITMAPFILEHEADER));<BR> if(counts != sizeof(BITMAPFILEHEADER)) {<BR> throw new CException;<BR> }<BR> if(bmfh.bfType != 0x4d42) {<BR> throw new CException;<BR> }<BR> size = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);<BR> m_lpBMPHdr = (LPBITMAPINFOHEADER) new char[size];<BR> // BITMAPINFOHEADER和颜色表<BR> counts = pFile->Read(m_lpBMPHdr, size); <BR> ComputeImage();<BR> ComputePaletteSize(m_lpBMPHdr->biBitCount);<BR> SetWinPalette();<BR> m_lpDIBits = (LPBYTE) new char[m_dwImageSize];<BR> counts = pFile->Read(m_lpDIBits, m_dwImageSize); <BR> }<BR> catch(CException* pe) {<BR> AfxMessageBox("Read error");<BR> pe->Delete();<BR> return FALSE;<BR> }<BR> return TRUE;<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:红苹果 回复日期:2003-11-23 11:31:25
<br>内容:CException在VC.net已经是一个抽象类,不能直接定义其对象,必须使用它的派生类来定义对象。比如,对于文件操作应该用CFileException* pe<BR><BR>所谓抽象类就是类中含有纯虚函数的类,也就是有虚函数被申明了,但没有被定义,如:<BR>virtual void dump( )=0;<BR>就是一个纯虚函数,申明该函数的类就是抽象类,这种类只能作为基类,不能直接使用。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lixiaofei 回复日期:2003-11-23 17:48:58
<br>内容:谢谢你!另外再向你请教两个问题,望不吝赐教<BR>1〉编译警告<BR>在BOOL CDemo_ViewDibApp::InitInstance()中,下面的语句为什么有问题<BR>{#ifdef _AFXDLL<BR> Enable3dControls(); // Call this when using MFC in a shared DLL<BR>#else<BR> Enable3dControlsStatic(); // Call this when linking to MFC statically<BR>这一句话编译警告:f:\图形图像\ch08\demo_viewdib\demo_viewdib.cpp(60): warning C4996: “CWinApp::Enable3dControlsStatic”被声明为否决的<BR>#endif<BR>2〉编译警告<BR>//存储图像<BR>void CDib::Serialize(CArchive& ar)<BR>{<BR> DWORD pos;<BR> pos = ar.GetFile()->GetPosition();//这一句编译警告<BR>f:\图形图像\ch08\demo_viewdib\cdib.cpp(541): warning C4244: “=” : 从“ULONGLONG”转换到“DWORD”,可能丢失数据<BR><BR> TRACE("CDib::Serialize -- pos = %d\n", pos);<BR> ar.Flush();<BR> pos = ar.GetFile()->GetPosition();//这一句编译警告与上一句相同<BR> TRACE("CDib::Serialize -- pos = %d\n", pos);<BR> if(ar.IsStoring()) {<BR> WriteFile(ar.GetFile());//WriteFile()自定义的函数<BR> }<BR> else {<BR> ReadFile(ar.GetFile());<BR> }<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:红苹果 回复日期:2003-11-23 18:35:11
<br>内容:1.<BR>{#ifdef _AFXDLL<BR> Enable3dControls(); // Call this when using MFC in a shared DLL<BR>#else<BR> Enable3dControlsStatic(); // Call this when linking to MFC statically<BR>这一句话编译警告:f:\图形图像\ch08\demo_viewdib\demo_viewdib.cpp(60): warning C4996: “CWinApp::Enable3dControlsStatic”被声明为否决的<BR>#endif<BR><BR>在VC.NET的新版MFC中改动较多,同样VC.NET已经不支持Enable3dControls或Enable3dControlsStatic函数,具体我也不清楚,你查查MSDN,我机器上没有.NET.不过这个警告可以不管。<BR><BR>2.<BR> pos = ar.GetFile()->GetPosition();//这一句编译警告<BR>f:\图形图像\ch08\demo_viewdib\cdib.cpp(541): warning C4244: “=” : 从“ULONGLONG”转换到“DWORD”,可能丢失数据<BR><BR>为了管理更大的文件,新版MFC的CFile的文件参数都是64为的了,GetPosition返回的是一个64位的无符号整型,而DWORD只是一个32位的无符号整型。这个警告可以不予理睬,只要你的文件不大于4GByte.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lixiaofei 回复日期:2003-11-24 19:47:44
<br>内容:谢谢你,红苹果,你知道的真多,以后还望你继续多指导指导!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -