怎样定义返回函数类型的函数?

Reve 2002-12-04 12:58:42
具体代码:
class CNewtonIterative {
private:
double x, x0, x01;
double (* f)(double); // 定义函数类型变量
double (* fp)(double);
public:
CNewtonIterative(double (* _f)(double), double _x0, double _x01)
: f(_f), x0(_x0), x01(_x01) {};
~CNewtonIterative() {};

CNewtonIterative& setF(double (* _f)(double)) { f = _f; };
//???? getF() const { return f; };
//这里我不知道怎么写返回的类型。
};

double f(double x) { return x * x - 2; };

//main
……
CNewtonIterative cni(f, 470, 475);
……
...全文
494 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Reve 2002-12-04
  • 打赏
  • 举报
回复
问题已结
jennyvenus(JennyVenus)说的比较模糊,ltxd()说的太过抽象,pgood(没看过海) 来得直截了当。
pgood 2002-12-04
  • 打赏
  • 举报
回复
我想这是你要要(在VC下通过)
// t1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
typedef double (*MyType)(double) ;
class CNewtonIterative
{
private:
double x, x0, x01;
double (* f)(double); // 定义函数类型变量
double (* fp)(double);
public:
CNewtonIterative(double (* _f)(double), double _x0, double _x01)
: f(_f), x0(_x0), x01(_x01) {};
~CNewtonIterative() {};

CNewtonIterative& setF(double (* _f)(double)) { f = _f; };
MyType getF() const { return f; };
};

double f(double x) { return x * x - 2; };



int main(int argc, char* argv[])
{
CNewtonIterative cni(f, 470, 475);
MyType p=cni.getF();
double x=p(10.0);
printf("Hello World! x=%f\n",x);
return 0;
}

ltxd 2002-12-04
  • 打赏
  • 举报
回复
对于有些比较复杂的如函数指针之类的声明,建议用typedef
如C库中有一叫signal的函数,其声明为:

void ( *signal( int sig, void (__cdecl *func) ( int sig [, int subcode ] )) ) ( int sig );

我不知道有几个人能在几钟之内将其看懂。
将其改写成:
typedef void (__cdecl *PSIGNAL)(int);

PSIGNAL signal(int sig, PSIGNAL func);

是不是要清晰多了?
Reve 2002-12-04
  • 打赏
  • 举报
回复
楼上的方法不行

楼上的楼上,贴的东西,没有关系到我的问题的主要点。对于传入函数指针,我是指导怎样用的。上边的代码就有。但是对于怎样传出来,也就是返回,这一点不知道。
难道说是不可以如此做的:因为无法通过如此的语法:cni.getF()(190);?
langzi8818 2002-12-04
  • 打赏
  • 举报
回复
#define double (*f) (double) pf
pf getF(){return f);
不知道可以不可以
用户 昵称 2002-12-04
  • 打赏
  • 举报
回复
声明函数指针并实现回调
赵湘宁

--------------------------------------------------------------------------------

程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。

声明函数指针

回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:

void f();// 函数原型

上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:

void (*) ();

让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:

// 获得函数指针的大小
unsigned psize = sizeof (void (*) ());

// 为函数指针声明类型定义
typedef void (*pfv) ();

pfv是一个函数指针,它指向的函数没有输入参数,返回类行为void。使用这个类型定义名可以隐藏复杂的函数指针语法。

指针变量应该有一个变量名:

void (*p) (); //p是指向某函数的指针

p是指向某函数的指针,该函数无输入参数,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。例如:

void func()
{
/* do something */
}
p = func;

p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。

传递回调函数的地址给调用者

现在可以将p传递给另一个函数(调用者)- caller(),它将调用p指向的函数,而此函数名是未知的:

void caller(void(*ptr)())
{
ptr(); /* 调用ptr指向的函数 */
}
void func();
int main()
{
p = func;
caller(p); /* 传递函数地址到调用者 */
}

如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。

调用规范

到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。

将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:

// 被调用函数是以int为参数,以int为返回值
__stdcall int callee(int);

// 调用函数以函数指针为参数
void caller( __cdecl int(*ptr)(int));

// 在p中企图存储被调用函数地址的非法操作
__cdecl int(*p)(int) = callee; // 出错


指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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