这是有问题的代码:
CFilePosIndicator::CFilePosIndicator()
{
m_nLowLimit = 0;
m_nHighLimit = 100;
SetFullRange();
m_nCurPos = -1; // initial invalid value
m_clrFont = RGB(0, 0, 0);
m_clrFrame = RGB(0, 0, 0);
m_clrSelRange = RGB(0, 0xed, 0);
m_clrPointer = RGB(0xed, 0, 0);
m_bAlignHorizen = true;
m_bAttachFile = false;
}
void CFilePosIndicator::SetFullRange()
{
m_listSelRange.RemoveAll();
TSelRange _selRange;
_selRange.from = m_nLowLimit;
_selRange.to = m_nHighLimit;
m_listSelRange.AddTail(_selRange);
if (m_nCurPos == -1)
m_nCurPos = m_nLowLimit;
}
错误在于SetFullRange()的内部引用了m_nCurPos,但是m_nCurPos现在还没有初始化!所以在构造函数中调用其它成员函数一定要小心,可能有两个错误:
1 如上个错误,成员函数引用了尚未初始化的其他数据成员。
2 第二个错误更加隐蔽,如果调用的是虚函数,则得不到多态的结果。
其大家互相监督,一定要养成习惯:
1 在构造函数中调用成员函数时候就要警惕。
2 即使用了其名称尽量能体现出它是初始化性质的,例如:_common_constrcut, _init(), _reset()。
3 简单成员的赋值在前,函数调用在后!
4 千万不要调用虚函数!
千万记住!