1

我有一个班级作业说:

为接受两个 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;
}
4

3 回答 3

4

函数指针类型为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; }
于 2012-10-21T21:44:03.250 回答
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);
于 2012-10-21T21:48:20.653 回答
1

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

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

(int, int)

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

(*)(int, int)

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

int (*)(int, int)

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

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

这将起作用。但是,实际上为函数指针定义自己的类型通常更清楚(使用typedef)。起初,这样做似乎很棘手,但很容易。您已经使用上述方法记下了类型。唯一缺少的是给它一个名字。你可以通过在*in后面写名字来做到这一点(*)。例如(*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(您typedef在上面编辑过):

func_ptr AddFunc_p;

您可以为其分配地址AddFunc()

AddFunc_p = AddFunc;

注意 中缺少的括号AddFunc。您只需编写函数的名称,因为您不想实际调用该函数,而是想要它的地址,以便您可以将其分配给AddFunc_p. 现在您可以AddFunc()通过以下方式拨打电话AddFunc_p

AddFunc_p(some_int, another_int);

您现在应该能够推断出如何将函数指针放入向量中以及如何将()运算符应用于其元素。记住向量只包含 type 的元素会有所帮助func_ptr

于 2012-10-21T22:06:21.127 回答