刚刚有位群员在群中提出这么一个问题:
比如有两个窗口对应的类分别为:CADlg、CBDlg
这两个窗口需要共同调用一个函数,那么关于这个函数该如何设计呢?
因为我想在函数中区分是哪个窗口调用的?参数我写成了默认的窗口类指针 CWnd*,CADlg 和 CBDlg 调用 fun 函数的时候会分别把自己的对象指针传进去的。
备注:CADlg、CBDlg 是对话框类所以默认都派生自 CDialog,而 CDialog 又派生自窗口类 CWnd
void fun(CWnd* dlg)
{
}
问题如果这样设计,那么我要如何区分是 CADlg 还是 CBDlg 呢?
对于正在学习C/C++但不知道学习路线,不知道该如何找到工作的朋友,我还是要推荐下我自己建的学习群:231662552,首先你要是学C/C++的,其次不管你是小白还是大牛,小编都挺欢迎,群里每天都会分享C/C++相关干货,有基础教程和项目视频资料,欢迎初学和进阶中的小伙伴
问题截图如下:
解答:这个问题我感觉方法也是有多种的,刚开始我是想在 CADlg 和 CBDlg 类中都各自添加一个成员变量,比如:int class_type; 在 CADlg 中将 class_type = 1,在 CBDlg 中 class_type = 2,之后,在 fun 函数中进行判断。
但是现在 fun 函数的参数是 CWnd* 类型,并不是 CADlg 或者 CBDlg,所以此时如果进行强制类型转换的话,不管是转换成 CADlg* 还是转换成 CBDlg* 都不太合适,因为你也不能确定参数传进来的到底是 CADlg 类型 还是 CBDlg 类型。
于是,我想这么办:定义一个基类,例如:CBaseDlg,如下:
class CBseDlg
{
public:
CBseDlg()
{
class_type = 0;
};
public:
int class_type;
};
本身 C++ 支持多重继承,所以让 CADlg 和 CBDlg 类不仅从其默认的父类继承过来,也从 CBseDlg 类继承过来。这样 CADlg 和 CBDlg 内部就都有 class_type 成员变量了。在 CADlg 的构造函数中将 class_type = 1,在 CBDlg 的构造函数中将 class_type = 2。
之后,将 fun 的参数类型改成 CBseDlg*,然后就可以在 fun 函数中做判断了:
void fun(CBseDlg* dlg)
{
if (dlg->class_type == 1)
{
//是 CADlg 类对象
}
else if (dlg->class_type == 2)
{
//是 CBDlg 类对象
}
}
大家明白了吗?自己亲自动手试一试吧!遇到问题了在下方回复,如果大家有其他的方法也可以一起回复吧!