5

関数ポインターを使用して、クラスにさまざまな関数を実装することを計画しています。ただし、そのような関数を実装しようとしているときに、少し問題が発生しました。

コードは次のとおりです。

std::vector<int> * (*create_vector)()
{
    std::vector<int> * vec_p = new std::vector<int>;
    return vec_p;
}

エラーは次のとおりです。

3: [Error] expected primary-expression before '*' token
3: [Error] 'vec_p' was not declared in this scope
3: [Error] expected '}' before ';' token 
4: [Error] expected unqualified-id before 'return' 
5: [Error] expected declaration before '}' token

関数ポインターについて誤解しているものはありますか、それとも別の問題ですか?

4

4 に答える 4

8

std::vector<int> * (*create_vector)()関数へのポインタを宣言します。ポインタ。関数ではありません。ポインタを続行して、それが関数であると偽ってその本体を定義することはできません。2つを別々に宣言する必要があります。

std::vector<int> * create_vector()
{
    std::vector<int> * vec_p = new std::vector<int>;
    return vec_p;
}

std::vector<int> * (*pcreate_vector)() = create_vector;
于 2013-02-08T10:08:13.817 に答える
5

関数と関数ポインタを同時に宣言することはできません。

関数を定義するだけです。

std::vector<int>* create_vector()
{
    std::vector<int>* vec_p = new std::vector<int>;
    return vec_p;
}

次に、(コードを読みやすくするために)typedefを作成するのが最善です。

typedef std::vector<int>* (*create_vector_func)();

そして今、あなたはそれを使うことができます:

create_vector_func myFunc = &create_vector;
于 2013-02-08T10:09:09.530 に答える
2

関数が実装され、関数ポインタを関数に向けることができます。関数ポインタ自体は実装されていません。

への変更:

std::vector<int>* create_vector()
{
    std::vector<int> * vec_p = new std::vector<int>;
    return vec_p;
}

次に、を指す関数ポインタを宣言できますcreate_vector()typedef関数ポインタの管理は、 :を使用して簡略化できます。

typedef std::vector<int>* (*func_t)();    // C++03
typedef decltype(&create_vector) func_t; // C++11

func_t f = create_vector;
auto f = create_vector; // C++11 option also.

コードがさらに複雑になり、エラーが発生しやすくなるため、可能であれば動的割り当ては避けてください。C ++ 11では、移動セマンティクスが導入されたため、この場合の値による戻りのコストは、vector名前vec_pがコピー元ではなく、元に移動されるため(期限切れになるため)、大幅に削減されます。動的に割り当てる必要がある場合は、スマートポインタの形式を使用してください。

于 2013-02-08T10:08:51.670 に答える
1

これは、関数ポインターを定義する方法ではありません。まず、あなたが持っている本体で関数を定義してから、それを関数ポインタに割り当てます。

于 2013-02-08T10:08:52.487 に答える