2012-08-08 24 views
5

In meiner Hauptfunktion erstelle ich ein Array von Objekten einer bestimmten Klasse „Menu“Funktionsparameter: Zeiger auf Array von Objekten

Und wenn ich eine Funktion aufrufen möchte ich einen Zeiger auf das Array liefern.

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

Frage: Was ist der richtige Weg, um die Funktionsparameter zu schreiben?

Ich versuche:

Function(&menu); 

und in Header-Datei:

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 *[] 

und ich kann nicht mit anderem Weg kommen, dies zu tun, und ich kann nicht eine Lösung für diesen finden bestimmtes Problem.

Einfach möchte ich auf den Menü-Array innerhalb der Funktion durch einen Zeiger zugreifen können. Was sind die Unterschiede im normalen Zeiger zu einem Zeiger auf ein Array?

Antwort

9

Erklärung:

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

Invocation:

Function(menu); 

Allerdings müssten Sie Function() informieren, wie viele Einträge in dem Array sind. Da diese C++ ist vorschlagen std::array oder std::vector mit der Kenntnis ihrer Größe hat, Anfang und Ende:

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

Entweder durch const oder nicht konstanten Zeiger

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

... oder durch const oder nicht -const Referenz

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

, die zu einer Vorlage verallgemeinert werden können, so dass die Array-Größe wird durch den Compiler ableiten:

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

Rufen Sie immer als Function(menu);

3

arbeiten sollten, wenn Sie

void Function(Menu * menu); 

verwenden und rufen

Function(menu); 

statt

Function(&menu); 
mit

Die Übergabe des Array-Namens bewirkt, dass er in einen Zeiger auf den im Array enthaltenen Typ abfällt. Wie @hmjd in seiner Antwort sagt, müssen Sie aber auch die Array-Größe übergeben, daher ist sein Vorschlag, einen Vektor zu verwenden, günstig, wenn diese Option für Sie offen ist.

0

können Sie

Function((void *) whatever_pointer_type_or_array_of_classes); 

in der Haupt verwenden.

Und in der Funktion:

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