2012-08-08 49 views
5

在我的主要功能的陣列創建某一類「菜單」功能參數:指向對象

的對象的數組,而當我調用一個函數我想提供一個指針數組。

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

問題:寫入函數參數的正確方法是什麼?

我嘗試:

Function(&menu); 

和頭文件:

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

,我不能拿出任何其他方式做到這一點,我不能找到解決這個特別的問題。

簡而言之,我希望能夠通過指針訪問函數內的Menu數組。普通指針指向數組的指針有什麼區別?

回答

9

聲明:

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

調用:

Function(menu); 

但是,您將需要告知Function()有多少項是在數組中。由於這是C++建議使用std::arraystd::vector有他們的大小知識,終始:

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

無論是常量或非常量指針

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

...或常量或非-const參考

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

這可以推廣到一個模板,使得數組的大小將由編譯器推斷出:

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

總是調用爲Function(menu);

3

應該工作,如果你使用

void Function(Menu * menu); 

,並呼籲使用

Function(menu); 

,而不是

Function(&menu); 

傳遞數組名稱會導致它衰減到指向包含在數組中的類型的指針。然而,正如@hmjd在他的回答中所說的,你還需要傳遞數組的大小,所以如果這個選項對你是開放的,他建議使用一個向量是有利的。

0

您可以在主使用

Function((void *) whatever_pointer_type_or_array_of_classes); 

而且在功能:

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