要用一个CObject衍生类的表,每个对象可能不同.方法(一个库)用到了 MFC的RTTI.
在用 CObList 的 AddTail(CObject*) 时出错,跟踪到汇编, 在push eax前指针加了 24(18H),这是为什么?插入的对象是我写的几个 从 CObject 衍生的类, 用了 IMPLEMENT_SERIAL 的,都没有问题.改成CPtrList可以用,但我要用到类别属性,怎么办?class CdqoObject : public CObject
{
....
};class CdqoClass1 : public CdqoObject
{
....
};class CdqoClass2 : public CdqoObject
{
....
};class CdqoClass3 : public CdqoObject
{
.....
protected:
CObList m_Objects;
};CdqoClass3::AddObject(CdqoClass1* pObj1)
{
m_Objects.AddTail((CObject*)pObj1);
}
在用 CObList 的 AddTail(CObject*) 时出错,跟踪到汇编, 在push eax前指针加了 24(18H),这是为什么?插入的对象是我写的几个 从 CObject 衍生的类, 用了 IMPLEMENT_SERIAL 的,都没有问题.改成CPtrList可以用,但我要用到类别属性,怎么办?class CdqoObject : public CObject
{
....
};class CdqoClass1 : public CdqoObject
{
....
};class CdqoClass2 : public CdqoObject
{
....
};class CdqoClass3 : public CdqoObject
{
.....
protected:
CObList m_Objects;
};CdqoClass3::AddObject(CdqoClass1* pObj1)
{
m_Objects.AddTail((CObject*)pObj1);
}
另外加了MS XML SDK 4.0,那个库就是要用这些,不会有关系吧.加SDK (2001年11月版)会出错的.
for(POSITION pos = m_ptrList->GetHeadPosition(); pos != NULL; )
{
_dataType val = (_dataType)m_ptrList->GetNext(pos);
......
} _listBase 是模板参数, 传入时是 CObList
_dataType 是模板参数, 传入时是 CObject*跟踪时val的值 与 CObList::AddTail(CObject* pObj)的 pObj值一样.所以说是插入时的问题
147: m_listQtObjects.AddTail(pObj);
00454FCF cmp dword ptr [ebp+8],0
00454FD3 je CdqoSubclip::InsertPicture+60h (00454fe0)
00454FD5 mov edx,dword ptr [ebp+8] <----第一个函数参数,是 pObj
00454FD8 add edx,18h <----- 加了18H ????
00454FDB mov dword ptr [ebp-8],edx
00454FDE jmp CdqoSubclip::InsertPicture+67h (00454fe7)
00454FE0 mov dword ptr [ebp-8],0
00454FE7 mov eax,dword ptr [ebp-8]
00454FEA push eax <----- 压栈
00454FEB mov ecx,dword ptr [ebp-4]
00454FEE add ecx,34h
00454FF1 call CObList::AddTail (0045cfee)
CdqoSubclip 相当于 CdqoClass3
{
if (NULL == pObj)
return;
TRACE3("%s,%d,Insert picture pointer=%08x\n", THIS_FILE, __LINE__, pObj); m_listQtObjects.AddTail((CObject*)pObj);
}
上面的汇编就是最后一句的
{
protected:
CObList m_listQtObjects;
}
class CdqoObject : public COtherParent, public CObject
{
}COtherParent是另一个非 MFC类,改成以下就好了
class CdqoObject : public CObject, public COtherParent
{
}