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)()声明一个指向函数的指针。一个指针。不是函数。您不能继续使用指针并假装它是一个函数并定义它的主体。您需要分别声明两者:

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()。管理函数指针可以使用 a 来简化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 回答