问题及原因
设计一款软件经常会遇到在一个选项卡(TabControl)中添加一些东西,然后需要初始化。我在做现在的项目的时候就需要在一个选项卡中添加下拉列表(ComboBox):
众所周知,初始化某一个ComboBox的时候需要Add String:
void Other1::Other1Init()
{
CTRL_1.AddString(_T("22"));
CTRL_1.AddString(_T("0"));
CTRL_1.AddString(_T("-20"));
CTRL_1.SetCurSel(1); //默认选择0
}
但是Tab Control的类和主界面的类在两个文件,在使用如下形式调用此Other1Init函数时,出现:
严重性错误 C2352 “OtherParaCtrl::OtherParaCtrlInit”: 非静态成员函数的非法调用
BOOL CC1Dlg::OnInitDialog()
{
Other1::Other1Init();
}
原因是其他文件不可以调用非static的public函数,于是将Other1Init的函数声明前面加了static:
此时在主窗口初始化的位置可以用 Other1::Other1Init();调用次函数了,但是在 Other1.c、 Other1.h文件中定义的ComboBox变量,由于自己所在的函数是static的而自己不是static的,又出现了:
严重性 错误 C2228 “.Combo Box1”的左边必须有类/结构/联合
严重性 错误(活动) 非静态成员引用必须与特定对象相对
解决方法
在主窗口头文件中实例化Other1为m_Other1,通过m_Other1.Other1Init();的方法进行调用: