如何定义指向函数的指针?

Posted

tags:

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

参考技术A 这个用typedef可以完成:
先定义一个函数指针的类型:typedef
void
(*pfun)();
然后用这个类型pfun定义一个数组
pfun
ptr[5];//[]里的数字是数组元素的个数,依情况而定:这儿用5做例子
这样ptr就是一个指向函数指针的数组。
对于“把一个指针强制定义”这我还没听过这个说法,只听过把指针强制转换成某个类型的指针:
强制类型转换用()运算,仍然用上面的定义类型。
例如:
void
*p;//p是一个void指针
pfun
ptr;//ptr是一个指向void函数的指针
ptr=(pfun)p;//把p强制转换成指向void函数的指针,然后就可以把它赋值给ptr指针。
不用typedef也可以,只要合并就可以了:
void
(*ptr[5])();//这样ptr就是一个函数指针数组了.这样看很费解的!不如用typedef。
对于强制类型转换最好还是用typedef,那样可读性好。
而且个人认为指针没有那种基本类型(指向函数的指针类型),那是一种新的类型。所以要先定义那种类型才行。
用typedef定义新类型又没有什么副作用,而且容易读懂,何必非要不用typedef呢?!没必要把简单的问题复杂化!!
程序代码的可读性是很重要的,写复杂的类型而不用typedef是很令人反感的!

如何定义和设置指向模板类方法的函数指针

我需要设置一个函数指针变量,它是X方法的模板类X的方法。

这是一个简单的例子。

X.h:

template<typename T>
class X {
public:
    typedef T (*valproc)(T v);

    X(T v);

    T add(T v);
    T val;
    valproc curproc;
};

X.cpp:

#include  "X.h"

template<typename T>
X<T>::X(T v) : val(v) {
    curproc = &X<T>::add;
}

template<typename T>
T X<T>::add(T v) {
    return v+val;
}

int main (int iArgC, char *apArgV[]) {
    X<int> *p = new X<int>(3);

    return  p->curproc(7);
}

当我编译它时,我收到一个错误:

$ g++ -c -g -Wall X.cpp
X.cpp: In instantiation of 'X<T>::X(T) [with T = int]':
X.cpp:15:29:   required from here
X.cpp:5:13: error: cannot convert 'int (X<int>::*)(int)' to 'X<int>::valproc {aka int (*)(int)}' in assignment
     curproc = &X<T>::add;

显然地

int (X< int >::* )(int)
is not the same as
int (*)(int)

如何定义正确的类型?

答案

X<int>::add是一个非静态成员函数。这意味着&X<int>::add具有类型int(X<int>::*)(int):指向X<int>的非静态成员函数的指针,它采用单个int参数并返回int。这样的指针不能转换为int(*)(int)

int(X<int>::*)(int)在概念上更类似于int(*)(X<int>*, int)而不是int(*)(int)(尽管实现可能实际上有很大不同,取决于平台的调用约定或inheritance is involved)。它需要一个额外隐藏的X<int>*参数:this指针。

做你想做的最简单的方法是使用包装器方法:

template<typename T>
class X {
public:
    using valproc = T(X::*)(T v);

    X(T v)
        : val{v},
          proc{&X::add}
    {}

    T add(T v) { return v + val; }
    T curproc(T v) { return (this->*proc)(v); }

    T val;
    valproc proc;
};

Live Demo

时髦的语法(this->*proc)(i)说“在procthis参数指向的对象上调用i指向的成员函数”。

另一答案
#include <stdio.h>

template<typename T>
class X {
public:
    X(T v);
    T add(T v);
    T val;
    int (X::*curproc)(T v);
};

template<typename T>
X<T>::X(T v) : val(v) {
    curproc = &X<T>::add;
}

template<typename T>
T X<T>::add(T v) {
    return v+val;
}

int main()
{
    printf("Hello World
");
    X<int> *p = new X<int>(3);

    printf("%d
",  (p->*(p->curproc))(7));
}
另一答案

通常,模板类在头文件中定义。您可以在这里找到更多信息:

另一答案

更改

return  p->curproc(7);

return (p->*(p->curproc))(7);

*(p-> currproc)是函数指针,需要在p对象指针上调用

详情

C++ function pointer (class member) to non-static member function

以上是关于如何定义指向函数的指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何定义和设置指向模板类方法的函数指针

c++的函数指针是怎么用的呀?

C语言如何声明一个返回函数指针的函数?

如何获得指向类的复制构造函数的成员函数指针?

c++类的成员函数指针如何转为普通指针

c++ 虚函数 如何调父类 而非子类