高手来请求改写一个函数!

lixang000 2008-09-19 11:17:12
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
#include<stdio.h>
using namespace std;

class myObj{
public:
myObj (int x=10) {m=x;}
void add(int (*_implement)(int )){cout<<_implement(m)<<endl;}
int m;
};
class myDoc{
public:
myObj theObj;
void Color2Value();
int implement(int x);
};
int myDoc::implement(int x){return ++x;}
void myDoc::Color2Value() { theObj.add(&myDoc::implement);}

int main()
{
myDoc Doc;
cout<<Doc.theObj.m<<endl;
}
error : “myObj::add”: 不能将参数 1 从“int (__thiscall myDoc::* )(int)”转换为“int (__cdecl *)(int)”
请帮助!
...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
OenAuth.Core 2008-09-19
  • 打赏
  • 举报
回复
thiscall仅仅应用于“C++”成员函数。this指针存放于CX/ECX寄存器中,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。
__cdecl
C调用约定(即用__cdecl关键字说明)(The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(如printf)只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。

声明的话直接像下面这样就行了
  int __cdecl    implement(int x); 



lixang000 2008-09-19
  • 打赏
  • 举报
回复
int (__thiscall myDoc::* )(int)”转换为“int (__cdecl *)(int)”
二者的区别:
__thiscall
__cdecl

如何声明函数为以下两种方式
__thiscall
__cdecl
lixang000 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hqin6 的回复:]
C/C++ codevoidmyDoc::Color2Value()
{int(myDoc::*p) (int);
p=implement;
theObj.add(p);
}
在类里面可以这样!
[/Quote]

error C3867: “myDoc::implement”: 函数调用缺少参数列表;请使用“&myDoc::implement”创建指向成员的指针
c:\documents and settings\administrator\桌面\sssssssssssssss\sssssssssssssss\xxxxxxxxxxxxxxxxxxxxxx.cpp(24) : error C2664: “myObj::add”: 不能将参数 1 从“int (__thiscall myDoc::* )(int)”转换为“int (__cdecl *)(int)”
没有使该转换得以执行的上下文
BetterMind 2008-09-19
  • 打赏
  • 举报
回复
up
太乙 2008-09-19
  • 打赏
  • 举报
回复


void myDoc::Color2Value()
{
int (myDoc::*p) (int);
p = implement;
theObj.add(p);
}
在类里面可以这样!

devil_zuiai 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 anglecloudy 的回复:]
C/C++ code#include<iostream>#include<string>#include<sstream>#include<fstream>#include<stdio.h>usingnamespacestd;classmyObj{public:
myObj (intx=10) {m=x;}voidadd(int(*_implement)(int)){cout<<_implement(m)<<endl;}intm;
};classmyDoc{public:
myObj theObj;voidColor2Value();staticintimplement(intx);//改成静态成员函数};intmyDoc::implement(intx){return++x;}voidmyDoc::Color2Value() { theObj.…
[/Quote]
UP
OenAuth.Core 2008-09-19
  • 打赏
  • 举报
回复
因为你需要的是一个类的函数地址而不是对象的。所以必需用静态成员函数
OenAuth.Core 2008-09-19
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <stdio.h>
using namespace std;

class myObj{
public:
myObj (int x=10) {m=x;}
void add(int (*_implement)(int )){cout <<_implement(m) <<endl;}
int m;
};
class myDoc{
public:
myObj theObj;
void Color2Value();
static int implement(int x); //改成静态成员函数
};
int myDoc::implement(int x){return ++x;}
void myDoc::Color2Value() { theObj.add(&myDoc::implement);}

int main()
{
myDoc Doc;
cout <<Doc.theObj.m <<endl;
return 0;
}
hanlin1985 2008-09-19
  • 打赏
  • 举报
回复
因为你那代码红色部分传进去的是成员函数的地址,而形式参数确实普通的函数指针,所以可以下面这样改动,
#include <iostream>
#include <string>
using namespace std;
class myDoc;
class myObj
{
public:
typedef int (myDoc::*MemFuncPtr)(int);
myObj(int x=10){m=x;}
void add(MemFuncPtr mfp)
{
cout<<(mp->*mfp)(m)<<endl;
}
int m;
myDoc *mp;
};

class myDoc
{
public:
myObj theObj;
void Color2Value();
int implement(int x);
};

int myDoc::implement(int x){return ++x;}

void myDoc::Color2Value()
{
theObj.add(&myDoc::implement);
}

int main()
{
myDoc doc;
cout<<doc.theObj.m<<endl;
return 0;

}

64,746

社区成员

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

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