类中函数指针调用函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类中函数指针调用函数相关的知识,希望对你有一定的参考价值。

class A
public:
A(int a,int b)num=a;num2=b;
A()
void (A::*t1)()=test;
t1();//这样编译通不过,ERROR:明显调用表达式前的括号必须具有(指针)函数类型
;
int num;
int num2;
void test()cout<<"test"<<endl;
;
void test1(int i)
cout<<"test1="<<i<<endl;


void main()
auto t1=&test1;
t1(1);

这样t1直接调用没有任何问题

参考技术A 你把head从函数里面拿出来,作为参数就可以了啊。

之前需要定义一个函数指针:typedef struct _Node (*Fun)(struct _Node *p);
然后定义show函数:
void show(Fun fun, struct _Node *head)

struct _Node *pTemp = NULL;

pTemp = fun(head);


这样就可以把head传进来了~
希望对你能有所帮助。追问

不明白我想用一个数组把这些函数保存起来,通过序号来调用,省嘚判断很多次

参考技术B 如果你 是 单单为了 “不明白我想用一个数组把这些函数保存起来,通过序号来调用,省嘚判断很多次”
你可以建个数组把这些对象的地址存起来 通过序号调用相应对象的函数追问

就一个对象,对象里有很多函数,我想用数组把他们保存起来,方便调用,(ps:我现在连单个函数指针都不会用了)

追答

要调用对象里面的函数直接点出就行了 感觉没必要保存

追问

在进行状态处理的时候,如果直接调用的话的话就要很多if判断或是switch,设想一下,如果有个数组,那就一行代码就搞定了,Lua,python里就有很多这样的用法

使类中的函数指针依赖于初始化值

【中文标题】使类中的函数指针依赖于初始化值【英文标题】:make function pointer in class dependent on initialized value 【发布时间】:2021-08-30 13:06:39 【问题描述】:

我想创建一个对象,并在初始化期间选择一个函数来执行一些计算。对于N 阶的多项式,必须调用某个函数,定义为someFunN。现在我可以用函数指针来做到这一点。我通过构造函数中的一个巨大的 if 块来做到这一点,

if (order == 2)
    SolveFun = &someFunPoly2;
else if (order == 3)
    SolveFun = &someFunPoly3;
// etc...
else
    SolveFun = &someFunPoly50;

但由于我的功能要到约 50 个订单,所以写起来有点乏味。还有其他方法可以定义someFunN 并在Polynomial 的初始化期间分配此函数吗?

someFunN的内容是由Matlab中的代码生成脚本生成的,还是可以修改的。

#include <iostream>

using namespace std;
struct vec;
class Polynomial;
double someFunPoly2(Polynomial *Poly, vec Pt, vec Ur);
double someFunPoly3(Polynomial *Poly, vec Pt, vec Ur);
double someFunPoly10(Polynomial *Poly, vec Pt, vec Ur); 

struct vec

    double x, y;
    vec(double x_, double y_) : x(x_), y(y_) 
;

class Polynomial

public:
    int order, n;
    double *p;
    double (*SolveFun)(Polynomial *, vec, vec);
    Polynomial(int order_)
    
        order = order_;
        n = order + 1;
        p = new double[n];
        for (int i = 0; i < n; i++)
            p[i] = 0.0;

        if (order == 2)
            SolveFun = &someFunPoly2;
        else if (order == 3)
            SolveFun = &someFunPoly3;
        else
            SolveFun = &someFunPoly10;
        // more and more cases...
    
;

double someFunPoly2(Polynomial *Poly, vec Pt, vec Ur)

    // some calculations for a poly of order 2
    cout << "using Poly with order " << Poly->order << " and this is someFunPoly2" << endl;
    return 2;


double someFunPoly3(Polynomial *Poly, vec Pt, vec Ur)

    // some calculations for a poly of order 2
    cout << "using Poly with order " << Poly->order << " and this is someFunPoly3" << endl;
    return 3;


double someFunPoly10(Polynomial *Poly, vec Pt, vec Ur)

    // some calculations for a poly of order 10
    cout << "using Poly with order " << Poly->order << " and this is someFunPoly10" << endl;
    return 10;


int main()

    vec P = vec(1.0, 2.0);
    vec U = vec(0.3, 0.5);
    Polynomial *Poly2 = new Polynomial(2);
    Polynomial *Poly10 = new Polynomial(10);

    cout << Poly2->SolveFun(Poly2, P, U) << endl;
    cout << Poly10->SolveFun(Poly10, P, U) << endl;

    return 0;

【问题讨论】:

指向函数的指针数组? @S.M.哦,太棒了,这是个好主意! 【参考方案1】:

您可能正在寻找查找表:

#include <iostream>

void say_hello()  std::cout << "Hello!\n";
void say_bye()    std::cout << "Bye!\n";
void say_thanks() std::cout << "Thanks!\n";

int main(void)

    int n = /*something 0-2*/;
    void (*says[])() = say_hello, say_bye, say_thanks;
    void (*speech)() = says[n];
    speech();

如果 n 是 0、1 或 2,那么它将分别打印 Hello!Bye!Thanks!

【讨论】:

以上是关于类中函数指针调用函数的主要内容,如果未能解决你的问题,请参考以下文章

objective-c 中如何在一个函数中调用自己类中的另外一个函数

虚函数和基类中的this指针的问题!

C++函数调用运算符 函数对象 函数指针

C++ 父类指针如何调用子类的变量和函数 虚函数virtual实例

C++ 父类指针如何调用子类的变量和函数 虚函数virtual实例

虚函数的调用