【问题标题】:What does it mean to have a function pointer type?有一个函数指针类型是什么意思?
【发布时间】:2012-10-21 21:37:42
【问题描述】:

我有一个班级作业说:

为接受两个 int 参数并返回一个 int 的函数编写声明,并声明其元素具有此函数指针类型的向量。

由于函数和向量都是 int,这是正确的吗?我对指针仍然很模糊。这就是我所拥有的:

#include <iostream>
#include <vector>
using std::cin; using std::cout; using std::endl; using std::vector;

// This is my function that take two ints and returns and int
int AddFunc ( int a, int b) { int addResult; addResult = a + b; return (addResult);}

int main()
{
    vector <int> v1; // Declare a vector whose elements have this functions pointer types
    int add1, add2, add3 = 0;
        cout << "Enter two numbers to be added with my AddFunc function: ";
        cin >> add1 >> add2;
        add3 = AddFunc (add1, add2);
        cout << "The numbers added equal: " << add3 << endl;
        v1.push_back(add3);
        cout << "The first element in the vector v1 is: " << v1 [0] << endl;
    return 0;
}

【问题讨论】:

  • 顺便说一句,有用的职业建议:不要养成将所有内容都写在一行的习惯。它使事情难以阅读。

标签: c++ function-pointers


【解决方案1】:

函数指针类型为int (*)(int, int)。你想要这个:

typedef int (*fptr)(int, int);

std::vector<fptr> v;

例子:

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

v.push_back(&add);
v.push_back(&mul);

然后是这样的:

for (f : v) { std::cout << "f(5, 7) = " << f(5, 7) << std::endl; }

【讨论】:

  • 要读取 typedef 行:将 type fptr 定义为一个指向函数的指针,该函数接受两个 int 参数并返回一个 int
【解决方案2】:

在 C++ 中,您可以定义函数指针,如下所示:

int (*pfunc) (int, int);

这是一个变量,你可以给它分配一个函数的地址,只要它有指定的签名,像这样:

pfunc = AddFunc; // Assign the adress of a function
pfunc(1,2) // Now call the function through the pointer

现在,注意pfunc 是变量名,它的“官方”类型是int (*) (int,int) 当然,这一切都会变得非常混乱,所以你可能想要 typedef 它:

typedef int (*AdderFunc)(int, int);
AdderFunc pfunc = AddFunc;
pfunc(1,2);

【讨论】:

    【解决方案3】:

    分配需要一个函数指针向量。如果你不习惯函数指针,阅读起来会有点困难。这是一种可以用来编写函数指针类型的方法。

    首先,编写函数的参数列表。 AddFunc() 接受两个 int 参数,所以一开始你有:

    (int, int)
    

    要使其成为函数指针,请在其前面加上 (*):

    (*)(int, int)
    

    最后,你在整个事情前面加上函数的返回类型。在这种情况下,int

    int (*)(int, int)
    

    您可以按原样使用它作为向量的类型:

    std::vector<int (*)(int, int)> v;
    

    这会奏效。但是,实际上为函数指针定义自己的类型通常更清楚(使用typedef)。起初,这样做似乎很棘手,但很容易。您已经使用上述方法记下了类型。唯一缺少的是给它一个名字。您可以通过在(*) 中的* 之后写名称来做到这一点。例如(*func_ptr),所以你有:

    int (*func_ptr)(int, int)
    

    这就是typedef 所需要的全部内容:

    typedef int (*func_ptr)(int, int);
    

    现在,只要您需要特定的函数指针类型,而不是:

    int (*)(int, int)
    

    你可以写:

    func_ptr
    

    相反。所以你的向量声明变成:

    std::vector<func_ptr> v;
    

    就向量而言,func_ptr 和其他指针类型一样。

    函数指针与“常规”指针的不同之处在于“取消引用”它们意味着调用它们指向的函数。您实际上并没有取消引用函数指针。相反,您对它们使用 () 运算符。这样做会调用它们指向的函数。

    分配给函数指针意味着分配给它一个函数的地址。例如,如果您有一个func_ptr 类型的变量(您在上面typedefed):

    func_ptr AddFunc_p;
    

    你可以给它分配AddFunc()的地址:

    AddFunc_p = AddFunc;
    

    注意AddFunc 中缺少的括号。你只写函数的名字,因为你不想真正调用那个函数,而是想要它的地址,这样你就可以把它分配给AddFunc_p。现在您可以通过AddFunc_p 致电AddFunc()

    AddFunc_p(some_int, another_int);
    

    您现在应该能够推断出如何将函数指针放入向量中,以及如何将() 运算符应用于其元素。请记住,向量仅包含 func_ptr 类型的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 2019-10-20
      • 2011-01-27
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多