2013-02-08 1 views
5

Sto pensando di utilizzare i puntatori di funzioni per implementare diverse funzioni in una classe. Tuttavia, ho avuto un po 'di problemi durante il tentativo di implementare una di queste funzioni.Problema con i puntatori di funzione in C++

Il codice è qui:

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

Gli errori sono i seguenti:

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 

C'è qualcosa che sto malinteso circa puntatori a funzione, o è una questione diversa?

+1

Non capisco cosa stai cercando di fare. Hai bisogno di una funzione, che restituisca un puntatore o un puntatore a funzione? –

risposta

8

std::vector<int> * (*create_vector)() dichiara un puntatore a una funzione. Un puntatore Non una funzione Non puoi andare avanti con il puntatore e fingere che sia una funzione e definire il suo corpo. È necessario dichiarare i due separatamente:

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

Ha senso. Grazie. – Mloc

2

Le funzioni sono implementate e puntatori a funzione può essere puntato verso funzioni. I puntatori di funzioni non sono implementati.

Passa a:

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

Poi si può dichiarare un puntatore a funzione per puntare a create_vector(). Gestione dei puntatori a funzione possono essere semplificati utilizzando un 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. 

Evitare l'allocazione dinamica, se possibile, in quanto introduce ulteriori complessità rendere il codice più soggetto a errori. In C++ 11, sono state introdotte le semantiche di spostamento in modo che il costo della restituzione in base al valore in questo caso si riduca significativamente poiché lo vector denominato vec_p sarà spostato da (come è in scadenza), non copiato da. Se è necessario allocare dinamicamente, utilizzare un modulo di smart pointer.

1

Questo non è il modo in cui si definisce un puntatore a funzione. Prima definire la funzione con il corpo che si ha e quindi assegnarla a un puntatore di funzione.

5

Non è possibile dichiarare una funzione e un puntatore di funzione contemporaneamente.

Basta definire la funzione:

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

Quindi, la cosa migliore è fare un typedef (per la leggibilità del codice):

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

E ora si può usare:

create_vector_func myFunc = &create_vector; 
+0

Grazie per averlo chiarito! – Mloc