博文

运输法虚重载(2008-11-03 21:47:00)

摘要:你这儿是没有办法把<<申明为virtual,因为作为成员函数   
  <<只能是ostream的member。   
  不过换一种方法还是可以的   
  大致如下哈:   
    
  class   FtpMessage   {   
  protected:   
      virtual   void   ToString(ostream   &os)   =   0;   
  public:   
      ...   
      friend   ostream&   operator   <<(ostream&   os,   FtpMessage   &   msg);   
  };   
    
  ostream&   operator   <<(ostream&   os,   FtpMessage   &   msg)   
  {   
    &nb......

阅读全文(3209) | 评论:1 | 复制链接

DLL(动态链接库)专题(2008-10-21 18:54:00)

摘要:(0)   Windows API中所有的函数都包含在dll中,其中有3个最重要的DLL。       (1)   Kernel32.dll       它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;       (2)   User32.dll      它包含那些用于执行用户界面任务(如窗口的创建和消息的传送)的函数,例如CreateWindow函数;       (3)   GDI32.dll      它包含那些用于画图和显示文本的函数。   1.      静态库和动态库 (1)   静态库          函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.Exe文件).当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。 (2)   动态库       在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件。虽然引入库的后缀名也是”lib”,但是动态库的引入库文件和静态库文件有着本质上的区别,对一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射......

阅读全文(3222) | 评论:1 | 复制链接

内存空间操作(2008-10-10 17:53:00)

摘要:一个new肯定只需要写一个delete:
int (*arr)[10] = new int[20][10];
//use it...
delete []arr;
或者:
int **arr2 = new int*[20];
for (int i = 0; i < 20; ++i) arr2[i] = new int[10];
//use it...
for (int i = 0; i < 20; ++i) delete arr2[i];
delete arr2;

......

阅读全文(2211) | 评论:1 | 复制链接

函数可以独立使用的特例(2008-10-01 20:14:00)

摘要:如下代码:
const static LPCTSTR g_szIPCCustomMsg =
    _T("{34F673E2-878F-11D5-B98A-00B0D07B8C7C}");
const static UINT g_wmScanPassword =    RegisterWindowMessage(g_szIPCCustomMsg);
函数在函数体外定义是合法的。

解释: 静态对象和全局对象的初始化是在main函数执行之前进行的. 初始化(包括构造, 析构)对象的时候可以调用函数, 并且也就这一种情况可以在主函数外部调用函数.
MFC里面不是有个全局变量theApp吗, 也是这样子.
另外,C语言只有规定过不能在函数体内定义函数,没有规定在函数体外不能调用函数,既然没有限制就是允许的!

......

阅读全文(2067) | 评论:1 | 复制链接

模式对话框(2008-09-17 19:10:00)

摘要:模式对话框
作者:冯明德 一、概述

对话框是一种特殊的窗口,它依据对话框模板资源而建立。
它与一般的窗口有些不同,很多过程由系统完成了,虽然用户还是要提供一个消息处理函数,但在此消息处理函数中,不需要将不关心的消息交由缺省消息处理函数。
实际上,调用缺省处理的过程又系统完成。 二、对话框消息处理函数

对话框也需要用户提供一个消息处理函数,但这个处理函数没有普通窗口的消息处理函数"权利大"。
对话框是一种系统定义的“窗口类”,它已经定义好了对应的消息处理函数。客户所作的消息处理函数,并不是直接与窗口连接,而是对对话框消息处理函数的一种补充,或者说“嵌入”。
因此,对话框处理函数不需要调用“缺省消息处理函数”。
当有消息被处理时,返回TRUE,没有消息需要处理时,返回FALSE,此时退出用户消息处理函数后,系统会去调缺省消息处理函数。 //对话框消息处理函数
//返回值类型为BOOL,与普通窗口处理函数不同。
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{
case WM_INITDIALOG :
return TRUE ; //返回真,表示消息被处理了。

case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
case IDCANCEL :
EndDialog (hDlg, 0) ; //使用EndDialog关闭对话框
return TRUE ;......

阅读全文(2075) | 评论:0 | 复制链接

不同系统平台下的watcom设置方法(2008-09-09 23:39:00)

摘要:

    ●32位DOS平台配置

    WATCOM=C:\OpenWatcom
    PATH=C:\OpenWatcom\Binw
    INCLUDE=C:\OpenWatcom\H
    LIBPATH=C:\OpenWatcom\LIB386
    EDPATH=C:\OpenWatcom\EDDAT

 

    ●32位Windows配置

    WATCOM=C:\OpenWatcom
    PATH=C:\OpenWatcom\Binnt
    INCLUDE=C:\OpenWatcom\H;C:\OpenWatcom\H\NT
    LIBPATH=C:\OpenWatcom\LIB386;C:\OpenWatcom\LIB386\NT
    EDPATH=C:\OpenWatcom\EDDAT


......

阅读全文(2125) | 评论:1 | 复制链接

程序完全脱离BCB运行(2008-09-09 23:37:00)

摘要:1、在prject->Options->Compiler中点击Release 2、在prject->Options->Packages中去掉Builder with runtime packages选项 3、在prject->Options->Linker中去掉Use dynamic RTL 选项 4、然后再编译。 这样编译出来的程序才可以完全脱离BCB运行。......

阅读全文(1507) | 评论:0 | 复制链接

C++中extern “C”含义深层探索(2008-09-04 08:41:00)

摘要:1.引言

  C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。
  2.从标准头文件说起

  某企业曾经给出如下的一道面试题:

  面试题
  为什么标准头文件都有类似以下的结构?

 


#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */


  分析
  显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。

  那么

#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif


  的作用又是什么呢?我们将在下文一一道来。
 
  3.深层揭密extern "C"

  extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。

  被extern "C"限定的函数或变量是extern类型的;

  extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句:

  extern int ......

阅读全文(2705) | 评论:0 | 复制链接

c++格式化输入输出(2008-08-24 22:40:00)

摘要:cin与cout 一:标准输入函数cin 不知道说它是个函数对还是不对,它是代表标准的输入设备--键盘。他是属于流的,他的用法和流的用法是一样的。也就是:cin>>变量; 小小的说明一下,输入多个变量可以写在一行,如:cin>>x>>y>>z; 这样写不是不允许,而是不好看,如果是不同的变量类型,那就更是没头没脑了。除了你,人家是不知道该输入什么的,所以,一般在输入语句的前面,我们一般都 要做一个提示,请输入×××,让人家心里有个底,知道这个变量是做什么的。 另外,这个函数是不用带地址符号"&"的,也不用写明变量类型,千万不要跟scanf混淆。当然他就也不检查变量输入是否合法。如: int i; couti; cout......

阅读全文(3350) | 评论:0 | 复制链接

C和C++在函数声明中的区别(2008-08-14 09:34:00)

摘要:C语言标准中,对没有声明的函数默认为int类型返回,比如下面的代码,注释部分可省略: #include // int max(int x,int y); int main( ) { int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d",c); return 0; } int max(int x,int y) { int z; if(x>y)z=x; else z=y; return(z); } 而ANSI C++更严格些,要求在函数调用前必须对所调用的函数做函数原型声明,上面的注释部分加上则会产生错误 而VC编译器本身能根据文件的后缀名来识别应该采用的是ANSI C(.c)或者ANSI C++(.cpp)标准,因此上述代码使用的 文件名以.c后缀能正常通过编译,而.cpp后缀时则将出错......

阅读全文(2673) | 评论:1 | 复制链接