1

次のようなクラスの課題があります。

2 つの 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()2 つの引数を取るintので、最初は次のようになります。

(int, int)

これを関数ポインタにするには、次の接頭辞を付けます(*)

(*)(int, int)

最後に、関数の戻り値の型を前に付けます。この場合、int:

int (*)(int, int)

ベクターのタイプとしてそのまま使用できます。

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

これは機能します。ただし、通常は、( を使用してtypedef) 関数ポインターの独自の型を実際に定義する方が明確です。一見難しそうに見えますが、簡単です。上記の方法を使用して、すでにタイプを書き留めています。欠けているのは、名前を付けることだけです。*の後に名前を書くことでそれを行い(*)ます。たとえば(*func_ptr)、次のようになります。

int (*func_ptr)(int, int)

そして、それはあなたが a に必要なすべてです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_pAddFunc()これで、次のように呼び出すことができますAddFunc_p

AddFunc_p(some_int, another_int);

()これで、関数ポインタをベクトルに配置する方法と、その要素に演算子を適用する方法を推測できるはずです。ベクトルには単に type の要素が含まれていることに注意してfunc_ptrください。

于 2012-10-21T22:06:21.127 に答える