碰到一个问题

refugeetaotao 2005-09-16 05:28:49
//---------------------------untitled5.h-----------------------------------
#include <iostream>
using namespace std;

typedef char* lpstr ;

class ctest ;

struct CRuntimeClass
{
lpstr m_pClassName ;
ctest* (*m_pfnCreate)() ;
CRuntimeClass* m_pBaseClass ;
CRuntimeClass* m_pNextClass ;
static CRuntimeClass* m_pFirstClass ;
} ;

struct Afx_Classinit
{ Afx_Classinit(CRuntimeClass *pNewClass) ; } ;

#define Runtime_Class(class_name) \
(&class_name::class##class_name)

#define Declare_Dynamic(class_name) \
public: \
static CRuntimeClass class##class_name ; \
virtual CRuntimeClass* GetRuntimeClass() const ;

#define _Implement_RuntimeClass(class_name, base_class_name, pfNew) \
static char class_name[] = #class_name ; \
struct CRuntimeClass class_name::class##class_name = { \
class_name, pfNew, Runtime_Class(base_class_name), NULL } ; \
static Afx_Classinit _init_##class_name(&class_name::class##class_name) ; \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name ; } \

#define Implement_Dynamic(class_name, base_class_name) \
_Implement_RuntimeClass(class_name, base_class_name, NULL)


class ctest
{
public:
virtual CRuntimeClass* GetRuntimeClass() const ;
public:
static CRuntimeClass classctest ;
} ;

class ctest2
{
Declare_Dynamic(ctest2)
} ;


//------------------------untitled1.cpp----------------------------------
#include <iostream>
#include "untitled5.h"
using namespace std ;

static char szCFurniture[] = "ctest" ;

CRuntimeClass ctest::classctest =
{ szCFurniture, NULL, NULL } ;

static Afx_Classinit _init_ctest(&ctest::classctest) ;

struct CRuntimeClass* CRuntimeClass::m_pFirstClass = NULL ;

Afx_Classinit::Afx_Classinit(CRuntimeClass *pNewClass)
{ pNewClass->m_pNextClass = CRuntimeClass::m_pFirstClass ;
CRuntimeClass::m_pFirstClass = pNewClass ;
}

CRuntimeClass* ctest::GetRuntimeClass() const
{
return &ctest::classctest ;
}

Implement_Dynamic(ctest2,ctest) // 显示错误出在这里

int main()
{

int t ;
cin>>t ;
}


编译器采用Dev--C++ 4.9.9.2

编译时候出现了错误: expected primary-expression before ',' token

我查了好几遍还是没能找出原因, 希望大家帮我看看, 或者给条线索也是很好的.
谢谢大家了:) !!!
...全文
143 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Stefine 2005-09-18
  • 打赏
  • 举报
回复
终于可以上网了

把代码给你贴出来吧(希望对你有所帮助)

test.h

#include <iostream>
using namespace std;
#define LPCSTR LPSTR
typedef char* LPSTR ;
#define PASCAL _stdcall

class Ctest ;

struct CRuntimeClass
{
LPCSTR m_lpszClassName ;
Ctest* (PASCAL* m_pfnCreateObject)() ;
CRuntimeClass* m_pBaseClass ;
CRuntimeClass* m_pNextClass ;

static CRuntimeClass* m_pFirstClass ;
} ;

struct Afx_Classinit
{ Afx_Classinit(CRuntimeClass *pNewClass) ; } ;

#define Runtime_Class(class_name) \
(&class_name::class##class_name)

#define Declare_Dynamic(class_name) \
public: \
static CRuntimeClass class##class_name ; \
virtual CRuntimeClass* GetRuntimeClass() const ;

#define _Implement_RuntimeClass(class_name, base_class_name, pfNew) \
static char _lpsz##class_name[] = #class_name ; \
struct CRuntimeClass class_name::class##class_name = { \
_lpsz##class_name, pfNew, Runtime_Class(base_class_name), NULL } ; \
static Afx_Classinit _init_##class_name(&class_name::class##class_name) ; \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name ; } \

#define Implement_Dynamic(class_name, base_class_name) \
_Implement_RuntimeClass(class_name, base_class_name, NULL)


class Ctest
{
public:
virtual CRuntimeClass* GetRuntimeClass() const ;
public:
static CRuntimeClass classCtest ;
} ;

class Ctest2 : public Ctest
{
Declare_Dynamic(Ctest2)
public:
Ctest2::Ctest2()
{
}
Ctest2::~Ctest2()
{
}
} ;

test.cpp

#include <iostream>
using namespace std ;
#include "test.h"

static char szCFurniture[] = "Ctest" ;

struct CRuntimeClass Ctest::classCtest =
{ szCFurniture, NULL, NULL} ;

static Afx_Classinit _init_Ctest(&Ctest::classCtest) ;

CRuntimeClass* CRuntimeClass::m_pFirstClass = NULL ;

Afx_Classinit::Afx_Classinit(CRuntimeClass *pNewClass)
{ pNewClass->m_pNextClass = CRuntimeClass::m_pFirstClass ;
CRuntimeClass::m_pFirstClass = pNewClass ;
}

CRuntimeClass* Ctest::GetRuntimeClass() const
{
return &Ctest::classCtest ;
}

Implement_Dynamic(Ctest2,Ctest) // 显示错误出在这里

void PrintAllClasses()
{
CRuntimeClass* pClass;
for(pClass=CRuntimeClass.m_pFirstClass;pClass!=NULL;pClass=pClass->m_pNextClass)
{
cout<<pClass->m_lpszClassName<< "\n";
}
}
void main()
{
PrintAllClasses();

}

另外还是要注意程序的书写规范,我没有仔细去改了,程序可以运行出来了就可以了


Stefine 2005-09-18
  • 打赏
  • 举报
回复
其实那天晚上就把你这个程序调试好了
可是这两天来寝室不能上网了,所以一直都没有来CSDN!
由于现在不在自己的机子上,不能把程序全部帖出来,所以就说明你犯的一些错误和提一点建议!

1:
error C2440: 'initializing' : cannot convert from 'class ctest2' to 'char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

这个错误是由于这里造成的 (加上级_lpsz## 在 class_name之前 )
static char _lpsz##class_name[] = #class_name ; \
struct CRuntimeClass class_name::class##class_name = { \
_lpsz##class_name, pfNew, Runtime_Class(base_class_name), NULL } ; \

注意_lpsz##这个地方你自己可以去MSDN查下

2:
error C2440: 'initializing' : cannot convert from 'struct CRuntimeClass *' to 'class ctest *(__stdcall *)(void)'

我在上一个帖里讲了你的那个struct 放错了位置,改正他的位置后
再声明PASCAL
#define PASCAL _stdcall
在CRuntimeClass的第二个参数那里 强制转换
ctest* (PASCAL *m_pfnCreate)() ;

到此程序基本上可以通过编译了!
不过你的MAIN函数里用那个输入根本没有意义

要想体现你这个程序的目的,最好加上一个PrintAllClasses()函数,看书的的都有!

最后给你提两点建议:
1:
程序规范问题,类命名的时候第一个字母为C(大写的C)这是大家都遵守的习惯,如我们常用的匈牙利命名法

2:
你要修改书上的代码,强烈建议你弄懂这个程序的目的及每一段的意义再来写你自己的程序!
像用console仿真MFC这样的代码本来就是那本书中的精华,自然也会有点难度了,你如果都不搞得很清楚就动手,难免会花很多的时间来调试,所以强烈建议楼主,把这部分至少看过两三遍后再写程序!到时自然也会明白了!(PS:我自己也很喜欢这六个仿真的地方,基本上可以带领我们进军MFC的源码,最主要的是它的消息流程!)

好的,废话也就说到这里了!

如果你还是没有调试出来的话,给我发短消息,我把源码发给你!

我也是菜鸟,大家一起成长!
很高兴能帮助到你


refugeetaotao 2005-09-16
  • 打赏
  • 举报
回复
谢谢所有楼上的朋友们.根据你们的提醒, 我对程序做了相应的修改,
主要就是楼上指出的那个明显的错误(class ctest2 : public ctest). 但错误结果依然相同.
由于楼上的采用VC6.0调试. 故有些错误我不能理解.
还有这的确是深入浅出MFC里的例子.我自己写写训练用的:)

我还在继续努力找出原因, 也希望大家能继续帮帮我看看,多谢了!!!
Stefine 2005-09-16
  • 打赏
  • 举报
回复
首先发现几处明显的错误(可能是笔误吧)

1:
class ctest2 : public ctest //这里明显要继承基类,不然你的那条链怎么连啊?
{
Declare_Dynamic(ctest2)
} ;
/* 加上struct*/ CRuntimeClass ctest::classctest =
{ szCFurniture, NULL, NULL } ;

struct CRuntimeClass* CRuntimeClass::m_pFirstClass = NULL ; //这里去掉struct

2:
你用的DEVC++,我用VC6.0调试,编译时出现的错误提示很明显:
error C2275: 'ctest2' : illegal use of this type as an expression
error C2440: 'initializing' : cannot convert from 'class ctest2' to 'char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
error C2440: 'initializing' : cannot convert from 'struct CRuntimeClass *' to 'class ctest *(__stdcall *)(void)'
There is no context in which this conversion is possible
这两个错误都是由于类型不匹配造成的!

你在定义的时候是这样的:
struct CRuntimeClass
{
lpstr m_pClassName ;
ctest* (*m_pfnCreate)() ;
CRuntimeClass* m_pBaseClass ;
CRuntimeClass* m_pNextClass ;
static CRuntimeClass* m_pFirstClass ;
} ;

注释掉这一行会少了第三个错误 //ctest* (*m_pfnCreate)() ;

我试着照书的去加上 _stdcall 可是还不行

第二个错误提示也很明显,是不能照ctest那样取得这个类的名称:
我看得眼睛痛了,你自己对照书上再仔细看下应该可以做出来

我也是菜鸟

有错误之处望路过高手不吝踢教





菜牛 2005-09-16
  • 打赏
  • 举报
回复
看你这个的意思,好像是深入浅出MFC里的,至少class ctest2应该是从class ctest继承的吧。
class ctest2 : public ctest
refugeetaotao 2005-09-16
  • 打赏
  • 举报
回复
回复人: zxyjyzxyjy(星星)

class ctest2
{
Declare_Dynamic(ctest2)
} ;

加点东西在这个类里试试。
//-----------------------------
什么意思啊. 加什么呢?
请问.你发现问题出在哪里了吗?谢谢呀
teli_eurydice 2005-09-16
  • 打赏
  • 举报
回复
友情 UP
zxyjyzxyjy 2005-09-16
  • 打赏
  • 举报
回复
class ctest2
{
Declare_Dynamic(ctest2)
} ;

加点东西在这个类里试试。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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