急!模拟MFC的RTTI 出现连接问题

Gordon_Freeman 2009-07-17 04:58:30
源代码如下

#include <windows.h>
#include <iostream.h>

class CObject;

struct CRuntimeClass
{
LPCTSTR m_lpszClassName;//类名
int m_nObjectSize;//对象大小
UINT m_wSchema;//类的版本号

CObject*(_stdcall *m_pfnCreateObject)();//动态创建的函数指针

CRuntimeClass *m_pBaseClass;//基类的地址

CObject *CreateObject();//动态创建的函数指针

CRuntimeClass *m_pNextClass;

BOOL IsDerivedFrom(CRuntimeClass *m_pBaseClass)const
{
const CRuntimeClass *pClassThis=this;
while(pClassThis!=NULL)
{
if(pClassThis==m_pBaseClass)
return TRUE;
pClassThis=pClassThis->m_pBaseClass;
}
return FALSE;
}
};

#define RUNTIME_CLASS(class_name) ( (CRuntimeClass*)&class_name::class##class_name)

class CObject
{
public:
static CRuntimeClass classCObject;

//成员函数
CRuntimeClass *GetRuntimeClass() const
{
return &classCObject;
}

BOOL IsKindOf(CRuntimeClass *pClass) const
{
CRuntimeClass *pClassThis=GetRuntimeClass();
return pClassThis->IsDerivedFrom(pClass);
}

};

struct CObject::classCObject =
{"CObject",sizeof(CObject),0xffff/*大小*/,NULL/*不支持动态创建*/
,NULL/*没有基类*/,NULL};


class CPerson: public CObject
{
public:
static CRuntimeClass classCPerson;

virtual CRuntimeClass* GetRuntimeClass() const
{
return RUNTIME_CLASS(CPerson);
}
};

struct CRuntimeClass CPerson::classCPerson=
{"CPerson",sizeof(CPerson),0xFFFF,NULL,&CObject::classCObject,
NULL};

void main()
{
CObject *pMyObject=new CPerson;

if( pMyObject->IsKindOf(RUNTIME_CLASS(CPerson)) )
{

cout<<"a CPerson Object!\n";

}
delete pMyObject;
}



为什么会出现
error LNK2001: unresolved external symbol "public: static struct CRuntimeClass CObject::classCObject" (?classCObject@CObject@@2UCRuntimeClass@@A)
Debug/asdfsdf.exe : fatal error LNK1120: 1 unresolved externals


如何解决?
...全文
75 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gordon_Freeman 2009-07-17
  • 打赏
  • 举报
回复
楼上正解。

修改如下. 已测试, 编译通过...
CRuntimeClass CObject::classCObject =
{
"CObject", /*类名*/
sizeof(CObject), /*对象大小*/
0xFFFF, /*版本号*/
NULL, /*不支持动态创建*/
NULL, /*没有基类*/
NULL
};

谢拉!
yshuise 2009-07-17
  • 打赏
  • 举报
回复
static CRuntimeClass classCObject; 

这个需要在类外面定义:
CRuntimeClass CObject::classCObject;
yshuise 2009-07-17
  • 打赏
  • 举报
回复
是我看错了。
我再看看。
Gordon_Freeman 2009-07-17
  • 打赏
  • 举报
回复
在这儿,在C++中 结构也可以做一种类,只不过数据成员默认为public 而class 默认为private
struct CRuntimeClass
{
LPCTSTR m_lpszClassName;//类名
int m_nObjectSize;//对象大小
UINT m_wSchema;//类的版本号

CObject*(_stdcall *m_pfnCreateObject)();//动态创建的函数指针

CRuntimeClass *m_pBaseClass;//基类的地址

CObject *CreateObject();//动态创建的函数指针

CRuntimeClass *m_pNextClass;

BOOL IsDerivedFrom(CRuntimeClass *m_pBaseClass)const
{
const CRuntimeClass *pClassThis=this;
while(pClassThis!=NULL)
{
if(pClassThis==m_pBaseClass)
return TRUE;
pClassThis=pClassThis->m_pBaseClass;
}
return FALSE;
}
};
yshuise 2009-07-17
  • 打赏
  • 举报
回复
对象的存在必须有类。还是那个原因,没有看见类在哪儿。
Gordon_Freeman 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yshuise 的回复:]
引用 2 楼 hellogmh 的回复:
class CObject
{
public:
static CRuntimeClass classCObject;


在这里,不是类,用来动态识别的 静态成员,为CRuntimeClass结构类型

static需要classCObject的完整定义。我没有看见你在哪儿定义?
[/Quote]

classCObject 是CRuntimeClass类的一个对象,不是类。
yshuise 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hellogmh 的回复:]
class CObject
{
public:
static CRuntimeClass classCObject;


在这里,不是类,用来动态识别的 静态成员,为CRuntimeClass结构类型
[/Quote]
static需要classCObject的完整定义。我没有看见你在哪儿定义?
rendao0563 2009-07-17
  • 打赏
  • 举报
回复
CObject *pMyObject=new CPerson;
CPerson *pPerson = dynamic_cast<CPerson *>pMyObject;
if (NULL != pPserson)
{
cout < <"a CPerson Object!\n";
}

delete pMyObject;
Gordon_Freeman 2009-07-17
  • 打赏
  • 举报
回复
class CObject
{
public:
static CRuntimeClass classCObject;


在这里,不是类,用来动态识别的 静态成员,为CRuntimeClass结构类型
Gordon_Freeman 2009-07-17
  • 打赏
  • 举报
回复
class CObject
{
public:
static CRuntimeClass classCObject;


在这里,不是类,用来动态识别的 静态成员,为CRuntimeClass结构类型
yshuise 2009-07-17
  • 打赏
  • 举报
回复
classCObject这个了类在哪儿?也生不成。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧