我在我的程序中使用了CList,其中放了我的类:
class CMyClass
{
.....CList<CMyDataClass,CMyDataClass&> m_MyDataList;
.....
}
这个链表中的东西是要存入数据库中的,因此,我在CMyClass中编写如下函数:
CMyClass::SaveToDatabase(....)
{
....
int nCount = m_MyDataList.GetCount();
POSITION pos = m_MyDataList.GetHeadPosition();
for ( int i = 0; i < nCount; i++ )
{
//数据存储操作
}
}在我的文档类中有一个CMyClass型的成员:
CMyClass m_myclass;我在文档类的OnSaveDocument函数中存储数据:
m_myclass.SaveToDatabase(....)
这样用户就能在运行程序时,点击保存按钮来随时保存数据了。我的问题是这样的,当我按一次保存按钮,没问题,查看数据库,数据也确实保存了,我第二次按保存按钮,就会出现一个调试错误,错误信息如下:
....
File:dbgheap.c
Line:1017Expression:_BOLCK_TYPE_IS_VALID(pHead->nBlockUse)
.....我调试了一下,错误就在SaveToDatabase的循环中产生的,我不明白这个错误的意思,更搞不懂为什么第二次按保存按钮出错?另外,我在使用CList的过程中,发现这个东西实在是不好用,本想不用自己写个链表,省点事,没想到却给我带来了很多的不便,不知大家可常用MFC的模板类,请畅谈一下自己的看法
class CMyClass
{
.....CList<CMyDataClass,CMyDataClass&> m_MyDataList;
.....
}
这个链表中的东西是要存入数据库中的,因此,我在CMyClass中编写如下函数:
CMyClass::SaveToDatabase(....)
{
....
int nCount = m_MyDataList.GetCount();
POSITION pos = m_MyDataList.GetHeadPosition();
for ( int i = 0; i < nCount; i++ )
{
//数据存储操作
}
}在我的文档类中有一个CMyClass型的成员:
CMyClass m_myclass;我在文档类的OnSaveDocument函数中存储数据:
m_myclass.SaveToDatabase(....)
这样用户就能在运行程序时,点击保存按钮来随时保存数据了。我的问题是这样的,当我按一次保存按钮,没问题,查看数据库,数据也确实保存了,我第二次按保存按钮,就会出现一个调试错误,错误信息如下:
....
File:dbgheap.c
Line:1017Expression:_BOLCK_TYPE_IS_VALID(pHead->nBlockUse)
.....我调试了一下,错误就在SaveToDatabase的循环中产生的,我不明白这个错误的意思,更搞不懂为什么第二次按保存按钮出错?另外,我在使用CList的过程中,发现这个东西实在是不好用,本想不用自己写个链表,省点事,没想到却给我带来了很多的不便,不知大家可常用MFC的模板类,请畅谈一下自己的看法
我在网上搜了一下,搜到这点东西:
http://www.china-askpro.com/msg45/qa72.shtml你去看看,好像还是没什么用啊
1。建议使用CObList而不是CList,因为CObList专门队列化对象
2。你的CMyDataClass一定要定义IMPLEMENT_SERIAL
这样应该可以了
我是向数据库中存数据啊,不用序列化的啊
深有同感,以后我都自己写链表了,唉,天下没有免费的午餐啊!
{
CMyDataClass& data = m_MyDataList.GetNext( pos );//我注掉除了这句外的所有语句,发现进行循环后,执行完这句就出错
}
CMyDataClass* pMyDataClass;
POSITION pos=m_MyDataList.GetNext(pos);
while(pos!=NULL)
{
pMyDataClass=(CMyDataClass*)m_MyDataList.GetNext(pos);
....
}
我觉的CList类挺好使的
我的代码是这样写的:
CMyClass::SaveToDatabase(....)
{
....
int nCount = m_MyDataList.GetCount();
POSITION pos = m_MyDataList.GetHeadPosition();
for ( int i = 0; i < nCount; i++ )
{
//数据存储操作
}
}
其中存储的是对象,而不是指针
我在调试器中观察了一下,pos不为空,晕
class CMyTest
{
public:
CString string1 ;
CString string2 ;
};
CMyTest *pTest ;
CList <CMyTest *, CMyTest *> mList ;//添加数据到链表
for( int i = 0; i < 10; i++ )
{
pTest = new CMyTest ;
pTest->string1.Format( "%d", i ) ;
pTest->string2.Format("0%d", i ) ;
mList.AddHead( pTest ) ;
}//显示
CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST1) ;
POSITION pos = mList.GetHeadPosition() ;
while( pos )
{
pListBox->AddString( mList.GetAt(pos)->string1) ;
mList.GetNext(pos) ;
}
没有问题的,最后再释放
CMyClass::SaveToDatabase(....) const
{
....
int nCount = m_MyDataList.GetCount();
POSITION pos = m_MyDataList.GetHeadPosition();
for ( int i = 0; i < nCount; i++ )
{
//数据存储操作
}
}我把const去掉就行了,问题是解决了,可我不清楚是什么原因,请哪位给个说法吧,谢了