MFC控件指针公用释放方法[void* | 指针的引用]

前言

  看见重复的代码就想封装,这个习惯转入C++之后也没改,即使效率有所影响也尽力去封装,比如在类的析构函数里面释放指针,一个个判断然后一个个delete然后再设置为NULL,就想着写一个公用释放指针的方法,也就有了下面的问题一。

 

文章

  1.   C++返回引用类型 指针的引用

 

正文

  一、问题函数

    本意:传入一个指针,判断指针是否为空,不为空的话就释放掉,这样在析构函数里面不用一段段重复写函数内的那段代码,封装后只用写如"FreeObj(pBtnSave);"就可以了。

BOOL FreeObj(void*  pObj)
{
    if(pObj)
    {
        delete pObj;
        pObj = NULL;
        return TRUE;
    }
    return FALSE;
}

    现实证明这种方法是行不通的,执行此方法后pBtnSave指针仍然不为空,然后想到了指针引用,能够定义如下函数,但是使用起来很复杂(- - # 事实上不知道怎么使用):

BOOL FreeObj(void*  &pObj)

 

  二、折中办法 

#define FreeObj(pObj) if(pObj){delete pObj;pObj=NULL}

  只是使用的话就不能带分号了,因为这是一个宏,然后发现C++宏好强大,这样写效率也应该没什么好说的了,但是被同事提醒,宏很强大但是切忌乱用。

 

  三、 一个指针的引用例子

void FreeObj(int* &pObj)
{
    if(pObj){
        delete pObj;
        pObj = NULL;
    }
}

//测试代码
    int*   a; 
    int b = 1;
    a = new int;
    *a = b;
    FreeObj(a);

    注意,如果测试代码写成如下则调用FreeObj(a)会出错:

    int*   a; 
    int b = 1;
    a = &b;
    FreeObj(a);

    当前对C++涉足尚浅,有朋友能解答一下的话非常感谢!

 

  四、摘录C++ Primer中关于”函数参数声明成引用还是指针呢?“ ,也许有所启示。

    引用必须被初始化为指向一个对象,一旦初始化了,它就不能再指向其他对象。指针可以指向一系列不同的对象也可以什么都不指向。

 

 

结束语

  感觉还没入门,等项目稍微缓点了还是系统的来恶补C++吧,通过这个例子对指针有了新的认识,目前的理解是函数传递指针只是传递了一个地址而已,也就是拷贝了指向同一个地址的指针,而传值是拷贝的一份数据,不同的是拷贝的指针能改变改地址的数据。

转载:http://www.cnblogs.com/over140/archive/2010/04/18/1713595.html

时间: 2024-10-29 02:07:42

MFC控件指针公用释放方法[void* | 指针的引用]的相关文章

duilib mfc中ocx控件-duilib如何调用mfc控件ocx中的方法,急!!!

问题描述 duilib如何调用mfc控件ocx中的方法,急!!! duilib如何调用mfc控件ocx中的方法啊?求大神赐教啊!!!谢谢了!!! 解决方案 这个我已经有思路了,但还是不知道怎么在duilib中加载,如何获取组件的iid?

MFC 控件指针前面 加 * 为何会通不过编译呢?

问题描述 MFC 控件指针前面 加 * 为何会通不过编译呢? 以前没有这样使用过, 呵呵, 今天突然发现 像下面的语句不能通过编译,呵呵. MFC 里有什么具体的说明么? 难道 控件指针前面不能 加 星号 去指针化? 非得 用 -> 运算符吗? CListCtrl* p_list = (CListCtrl*)GetDlgItem(IDC_LIST1); CListCtrl local_list_ctrl = *p_list; 解决方案 控件类型不支持指针的解引用,它不是简单的可以转换回来的. 解

ASP.NET用户控件返回事件的方法

asp.net|控件 ASP.NET用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持.本文讨论用户控件返回事件的方法. 假定用户控件(UserControl.ascx)中包含按钮控件AButton,希望实现按AButton按钮时,包含该用户控件的页面可以接收到事件.为此,小鸡射手在用户控件和页面的代码中分别作了处理. UserControl.ascx.cs中的处理: 1. 定义public的事件委托,如ClickEventHandler; 2. 在UserControl类中

C++获得其他程序窗体控件中信息的方法

  本文实例讲述了C++获得其他程序窗体控件中信息的方法.分享给大家供大家参考.具体分析如下: 这里演示了获得其他程序窗体控件信息的方法, 用FindWindow API找到文本框句柄,用SendMessage(WM_GETTEXT)获得文本 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <windows.h> BOOL CALLBACK EnumChildPro

灵活掌握asp.net中gridview控件的多种使用方法(下)_实用技巧

继续上篇文章的学习<灵活掌握asp.net中gridview控件的多种使用方法(上)>,在此基础上巩固gridview控件的操作使用,更上一层楼. 11.GridView实现用"..."代替超长字符串:效果图:   解决方法:数据绑定后过滤每一行即可 for (int i = 0; i <= GridView1.Rows.Count - 1; i++) { DataRowView mydrv; string gIntro; if (GridView1.PageInde

灵活掌握asp.net中gridview控件的多种使用方法(上)_实用技巧

灵活使用asp.net中gridview控件的方法有很多种,本文内容很富,希望大家都能有所收获. 1.GridView无代码分页排序: 效果图: 小提示: 1.AllowSorting设为True,aspx代码中是AllowSorting="True": 2.默认1页10条,如果要修改每页条数,修改PageSize即可,在aspx代码中是PageSize="12". 3.默认的是单向排序的,右击GridView弹出"属性",选择AllowSort

C++获得其他程序窗体控件中信息的方法_C 语言

本文实例讲述了C++获得其他程序窗体控件中信息的方法.分享给大家供大家参考.具体分析如下: 这里演示了获得其他程序窗体控件信息的方法, 用FindWindow API找到文本框句柄,用SendMessage(WM_GETTEXT)获得文本 #include <windows.h> BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev

Android实现EditText控件禁止输入内容的方法(附测试demo)_Android

本文实例讲述了Android实现EditText控件禁止输入内容的方法.分享给大家供大家参考,具体如下: 问题: android如何实现EditText控件禁止往里面输入内容? 修改版解决方法: EditText editText = (EditText) findViewById(R.id.editText1); editText.setKeyListener(null); 看到这个问题大家可能有点奇怪了,EditText的功能不就是往上面写入内容吗? 再者,如果真要禁止输入文本,在布局文件中

Android编程获取屏幕宽高与获取控件宽高的方法_Android

本文实例讲述了Android编程获取屏幕宽高与获取控件宽高的方法.分享给大家供大家参考,具体如下: 获取屏幕宽高 // 获取屏幕宽高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px) int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕高(像素,如:800p) L