请教关于类成员函数指针的问题

8611 2007-12-19 03:12:52
我要在类的成员函数内调用以下全局函数,该函数的第4个参数为函数指针:
double half(const double x0, const double x1, const double y, double (*fptr)(const double));

以一个简单的表示矩形的类进行说明。

class rectangle //矩形
{
private:
double m_b; //矩形宽度
double m_h; //矩形高度
public:
rectangle(const double b, const double h):m_b(b),m_h(h) {}
double get_a(const double y) {return m_b*y;} //返回矩形内高度为y范围内的面积
double get_y(const double a);
};

double rectangle::get_y(const double a)
{
return half(0,m_h,a,get_a);
}

在编译时get_y函数内出现如下错误信息:
cannot convert parameter 4 from 'double (const double)' to 'double (__cdecl *)(const double)'

好像成员函数名不是函数指针,请问应如何改正。


...全文
216 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
baihacker 2007-12-22
  • 打赏
  • 举报
回复

class rectangle;
double half(const double x0, const double x1, const double y,
double (rectangle::*fptr)(const double))//注意声明
{
return 0;
}

class rectangle //矩形
{
private:
double m_b; //矩形宽度
double m_h; //矩形高度
public:
rectangle(const double b, const double h):m_b(b),m_h(h) {}
double get_a(const double y) {return m_b*y;} //返回矩形内高度为y范围内的面积
double get_y(const double a);
};

double rectangle::get_y(const double a)
{
return half(0,m_h,a,&rectangle::get_a);
//return half(0,m_h,a,get_a); //一样行
}

int main()
{
return 0;
}
baihacker 2007-12-22
  • 打赏
  • 举报
回复

class rectangle;
double half(const double x0, const double x1, const double y,
double (rectangle::*fptr)(const double))//注意声明
{
return 0;
}

class rectangle //矩形
{
private:
double m_b; //矩形宽度
double m_h; //矩形高度
public:
rectangle(const double b, const double h):m_b(b),m_h(h) {}
double get_a(const double y) {return m_b*y;} //返回矩形内高度为y范围内的面积
double get_y(const double a);
};

double rectangle::get_y(const double a)
{
return half(0,m_h,a,&rectangle::get_a);
//return half(0,m_h,a,get_a); //一样行
}

int main()
{
return 0;
}
tonysdu1981 2007-12-22
  • 打赏
  • 举报
回复
兄弟,你这个程序有两点不对,一个是half函数只有声明没有定义,另一个是函数指针使用错误,你声明的只是个指向普通函数的指针,但在使用时,它却指向了类的函数,这是不充许的。至少你得这样声明吧
double (rectangle::*)(const double));
阿呆_ 2007-12-20
  • 打赏
  • 举报
回复
>>>如何能得到非静态的成员函数的指针?
即使你得到了也没用,成员函数和普通函数相比看上去定义一样, 实际上多一个参数(第一个参数是自动传入的this指针)
比如成员函数 int func(int); 真正对应的普通函数其实是: int func(void*,int);
qq51931375 2007-12-20
  • 打赏
  • 举报
回复
class rectangle //矩形
{
private:
double m_b; //矩形宽度
double m_h; //矩形高度
public:
rectangle(const double b, const double h):m_b(b),m_h(h) {}
double get_a(const double y) {return m_b*y;} //返回矩形内高度为y范围内的面积
double get_y(const double a);
};
double half(const double x0,const double x1,const double y,double (rectangle:: * fptr)(const double))
{
return 1;
}

double rectangle::get_y(const double a)
{
return half(0,m_h,a,&rectangle::get_a);
}
void main()
{
rectangle rect(10,20);
}
8611 2007-12-20
  • 打赏
  • 举报
回复
如何能得到非静态的成员函数的指针?
chenchaogba 2007-12-20
  • 打赏
  • 举报
回复
类的设计有失误吧? rectangle类的成员函数get_y怎么能调用全局函数half?
而且类的成员函数是 __thiscall
普通函数是 __cdecl
具体区别可以看 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1814744
yutaooo 2007-12-20
  • 打赏
  • 举报
回复

lz是不是这个意思? 如果是,那最好重新设计一下。


#include <iostream>

class rectangle;

double half(const double x0, const double x1, const double y,
rectangle &t, double (rectangle::*fptr)(const double)) {
return x0 + x1 + y + (t.*fptr)(y);
}

class rectangle {
public:
rectangle(const double b, const double h)
: m_b(b), m_h(h) {
}

double get_a(const double y) {
return m_b*y;
}

double get_y(const double a) {
return half(0, m_h, a, *this, &rectangle::get_a);
}
private:
double m_b; //矩形宽度
double m_h; //矩形高度
};

int main() {

std::cout << rectangle(1.0, 2.0).get_y(3.0) << std::endl;

return (0);
}

mathe 2007-12-20
  • 打赏
  • 举报
回复
double half(const double x0, const double x1, const double y, double (*fptr)(const rectangle&, const double));
===>
double half(const double x0, const double x1, const double y, , const rectangle&, double (*fptr)(const rectangle&, const double));
///Or define a global pointer to rectangle (or a global rectangle instance)
mathe 2007-12-20
  • 打赏
  • 举报
回复
You should use a workaround method:

class rectangle;
double half(const double x0, const double x1, const double y, double (*fptr)(const rectangle&, const double));

class rectangle //矩形
{
private:
double m_b; //矩形宽度
double m_h; //矩形高度
public:
rectangle(const double b, const double h):m_b(b),m_h(h) {}
double get_a(const double y)const {return m_b*y;} //返回矩形内高度为y范围内的面积
double get_y(const double a)const;
};

double rectangle::get_y(const double a)const
{
return half(0,m_h,a,get_a);
}

static double rectangle_get_a(const rectangle& this_rectangle, const double y){
return this_rectangle.get_a(y);
}

next is call function half with rectangle_get_a as one of the parameter (you also need passing the reference or pointer of rectangle)


Jim_King_2000 2007-12-19
  • 打赏
  • 举报
回复
只能定义全局函数或者静态类函数传递给该指针。
不知道double (*fptr)(const double)的具体用途,如果按照lz的程序,那么该函数指针的设计有失误。
sinosinux 2007-12-19
  • 打赏
  • 举报
回复
上面的声明是错误的-_-||, 我也不知道改怎么写.
你可以写个函数模板
sinosinux 2007-12-19
  • 打赏
  • 举报
回复
指向非静态成员函数的指针不是真正的指针.
double half(const double x0, const double x1, const double y, double (rectangle::* fptr)(const double));

64,639

社区成员

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

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