导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

在类中使用函数指针的问题

cutrain2009 2009-08-19 02:11:47
在类中使用函数指针碰到了类型的问题
我是为了写尔罗斯方块的
其中有个类定义如下
class CRussia :public CObject
{
public:
void DefaultExtraBeginFunction();
void SetExtraBiginFuction(void (CRussia::*_func)());
void Begin();
BOOL CheckGameOver();
void RotateShape();
void MoveShapeDown();
void MoveShapeRight();
void MoveShapeLeft();
void Display(CDC *_pDC);
CRussia();
virtual ~CRussia();

private:
void (CRussia::*ExtraBegin)();
int CheckOverBoard();
void MakeNewShape();
BOOL AttemptMoveShape(UINT nChar);
void Prepare();
CBoard m_Board;
CShape m_Shape;
POINT m_ShapeCorrd;
POINT m_pointLeftTop;
CSize m_size;
};

我的目的是为了在执行Begin()中插入一些在类的外部动态需要的函数,所以用到了制作函数,ExtraBegin

如果我定义成 void (*ExtraBegin)();
会在 给函数指针赋值的时候说不匹配(__celle)忘了类型了
于是我定义成void (CRussia::*ExtraBegin)();
这样可以完成赋值的操纵,
但是调用的时候出错
如果是(*ExtraBgin)()调用
E:\mfc\MyIdeal\俄罗斯方块\9\Russia.cpp(172) : error C2171: '*' : illegal on operands of type 'void (__thiscall CRussia::*)(void)'
E:\mfc\MyIdeal\俄罗斯方块\9\Russia.cpp(172) : error C2064: term does not evaluate to a function

如果是(CRussia::*ExtraBegin)()调用
E:\mfc\MyIdeal\俄罗斯方块\9\Russia.cpp(172) : error C2059: syntax error : '<tag>::*'


我是第一次接触到类中的指针函数,没点头绪,请大家解释下,说下类中指针函数的使用
...全文
450 点赞 收藏 29
写回复
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjing208192 2009-10-23
来迟了
回复
TearyWang 2009-08-20
在类外的函数声明和定义中,加上 __stdcall 关键字。此关键字表示一种连接方式,它是表示以标准形式连接。
回复
cutrain2009 2009-08-20
谢谢啦
回复
cutrain2009 2009-08-19
还出现个问题,
我怎么把外部函数赋值给类里的函数指针啊
也就是
类外地为void (__cdecl *)(void)
而类内地是
void (__thiscall CRussia::*)(void)
回复
TearyWang 2009-08-19
抱歉,#24中,有一处写错了。
函数指针在类的外部,这样声明:
typedef 返回值 (__stdcall *类名::函数名)(参数表);
typedef void (__stdcall *CRussia::ExtraBegin)(void);
回复
TearyWang 2009-08-19
类中的函数,这样声明:
static 返回值 __stdcall 函数名(参数表);
static void __stdcall ExtraBegin();

函数指针在类的外部,这样声明:
typedef 返回值 (*类名::函数名)(参数表);
typedef void (*CRussia::ExtraBegin)(void);

函数调用:
(*类名::函数名)(参数表);
(*CRussia::ExtraBegin)(void);

回复
雪影 2009-08-19
函数前面添加 static
回复
雪影 2009-08-19
将类内部的函数设置成静态的,就可普通的函数类型一样的了。
回复
cutrain2009 2009-08-19
还出现个问题,
我怎么把外部函数赋值给类里的函数指针啊
也就是
类外地为void (__cdecl *)(void)
而类内地是
void (__thiscall CRussia::*)(void)
回复
cutrain2009 2009-08-19
ExtraBegin()是一个函数指针
回复
cutrain2009 2009-08-19
哈哈
谢谢啦,调用成功
回复
TearyWang 2009-08-19
把你定义ExtraBegin,声明ExtraBegin,及调用ExtraBegin的代码贴出来……
回复
greatws 2009-08-19
调用时候这样 (this->*ExtraBegin)();
回复
cutrain2009 2009-08-19
我把类内地子函数赋值给函数指针的时间出现匹配问题
回复
cutrain2009 2009-08-19
E:\mfc\MyIdeal\俄罗斯方块\9\Russia.cpp(23) : error C2440: '=' : cannot convert from 'void (__thiscall CRussia::*)(void)' to 'int (__cdecl *)(void)'
There is no context in which this conversion is possible
E:\mfc\MyIdeal\俄罗斯方块\9\Russia.cpp(188) : error C2440: '=' : cannot convert from 'void (__thiscall CRussia::*)(void)' to 'int (__cdecl *)(void)'
There is no context in which this conversion is possible
执行 cl.exe 时出错.

这个类型怎么转换?
回复
cutrain2009 2009-08-19
以前写指针函数的时候都不需要申明指针类型哦
回复
雪影 2009-08-19
另外据我所知
函数指针类型声明需要使用typedef的
回复
TearyWang 2009-08-19
记得用typedef 声明。
回复
雪影 2009-08-19
这只是声明指针类型,而不是声明函数指针。
不要搞错概念
回复
cutrain2009 2009-08-19
把类中的成员函数赋值给函数指针就会出现匹配问题
void (__thiscall CRussia::*)(void)' to 'int (__cdecl *)(void)'

怎么转换
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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