2012-08-08 16 views
5

nella mia funzione principale che crea un array di oggetti di una classe certa "Menu"Parametro di funzione: Puntatore array di oggetti

E quando chiamo una funzione voglio fornire un puntatore a tale matrice.

Menu menu[2]; 
// Create menu [0], [1] 
Function(POINTER_TO_ARRAY); 

Domanda: Qual è il modo corretto di scrivere i parametri Function?

cerco:

Function(&menu); 

e nel file di intestazione:

void Function(Menu *menu[]); // not working 
error: Cannot convert parameter 1 from Menu(*)[2] to Menu *[] 

void Function(Menu * menu); // not working 
error: Cannot convert parameter 1 from Menu(*)[2] to Menu *[] 

e non posso venire con qualsiasi altro modo per fare questo e non riesco a trovare una soluzione a questo problema particolare

Semplicemente, voglio essere in grado di accedere alla matrice di menu all'interno della funzione attraverso un puntatore. Quali sono le differenze nel puntatore normale a un puntatore a un array?

risposta

9

Dichiarazione:

void Function(Menu* a_menus); // Arrays decay to pointers. 

Invocazione:

Function(menu); 

Tuttavia, si avrebbe bisogno di informare i Function() il numero di voci nella matrice. Poiché si tratta di C++ suggerire utilizzando std::array o std::vector che hanno conoscenza della loro dimensione, inizio e fine:

std::vector<Menu> menus; 
menus.push_back(Menu("1")); 
menus.push_back(Menu("2")); 

Function(menus); 

void Function(const std::vector<Menu>& a_menus) 
{ 
    std::for_each(a_menus.begin(), 
        a_menus.end(), 
        [](const Menu& a_menu) 
        { 
         // Use a_menu 
        }); 
} 
3

Sia per const o non-const puntatore

void Function(Menu const* menu); 
void Function(Menu* menu); 

... o const o non riferimento -const

void Function(Menu const (&menu)[2]); 
void Function(Menu (&menu)[2]); 

che può essere generalizzato a un modello in modo che la dimensione array viene dedotto dal compilatore:

template<size_t N> void Function(Menu const (&menu)[N]); 
template<size_t N> void Function(Menu (&menu)[N]); 

chiamare sempre come Function(menu);

3

dovrebbe funzionare se si utilizza

void Function(Menu * menu); 

e chiamare utilizzando

Function(menu); 

invece di

Function(&menu); 

passando il nome dell'array provoca il decadimento di un puntatore al tipo contenuto nell'array. Tuttavia, come dice @hmjd nella sua risposta, dovrai anche passare la dimensione dell'array, quindi il suo suggerimento di usare un vettore è favorevole se questa opzione è aperta a te.

0

È possibile utilizzare

Function((void *) whatever_pointer_type_or_array_of_classes); 

nel vostro principale.

E nella funzione:

type Function(void * whatever) 
{ 
    your_type * x =(your_type *) whatever; 
    //use x 
    .... 
    x->file_open=true; 
    .... 
} 
Problemi correlati