2013-02-08 61 views
5

我正在计划使用函数指针在类中实现不同的函数。 但是,我试图实现一个这样的功能时遇到了一些麻烦。C++中的函数指针问题

的代码是在这里:

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 

有什么事我误解有关函数指针,或者是一个不同的问题?

+1

我不明白你想要做什么。你需要函数,它返回一个指针或函数指针? –

回答

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; 
+0

有道理。谢谢。 – Mloc

2

功能已实现,函数指针可指向函数。函数指针本身没有实现。

更改为:

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

然后,你可以声明一个函数指针在create_vector()点。如果尽可能它引入了额外的复杂性使得代码更容易出错

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. 

避免动态分配:管理函数指针可以使用typedef被简化。在C++ 11中,引入了移动语义,因此在这种情况下返回值的成本显着降低,因为名为vec_pvector将从移至,因为(因为它即将到期)而不是从中复制。如果您必须动态分配使用smart pointer的形式。

1

这不是你如何定义函数指针。首先用你有的身体定义函数,然后把它分配给一个函数指针。

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; 
+0

感谢您的理解! – Mloc