2012-08-08 22 views
5

dizisine Pointer ben belli bir sınıf "Menü"İşlev parametresi: benim ana fonksiyonunda nesnelerin

ait nesneleri dizisini oluşturmak Ve ben bir işlevi çağırmak zaman o diziye bir işaretçi sağlamak istiyoruz.

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

Soru: İşlev parametrelerini yazmanın doğru yolu nedir?

Function(&menu); 

ve Üstbilgi dosyasında:

denemek

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

ve bunu yapmak başka yol ile gelip olamaz ve bu konuya bir çözüm bulamıyor özel problem.

Basitçe, işlev içindeki Menü dizisine bir işaretçi aracılığıyla erişmek istiyorum. Bir diziye işaretçi için normal işaretçi arasındaki fark nedir?

cevap

9

Beyanı:

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

Çağırma:

Function(menu); 

Ancak, dizideki kaç girişleri Function() bilgilendirmek gerekir.

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

... veya const olan veya olmayan yoluyla const veya const olmayan pointer tarafından

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

İkisinden: Bu olduğundan C std::array veya bunların büyüklüğü bilgisine sahip std::vector, başlangıç ​​ve bitiş kullanarak önermek ++ dizi büyüklüğü derleyici tarafından çıkarılabilir, böylece bir şablona genelleştirilebilir -const referans

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

:

3

Eğer

void Function(Menu * menu); 

kullanırsanız çalışmak ve

Function(menu); 

yerine

Function(&menu); 
kullanarak arayayım mı olarak
template<size_t N> void Function(Menu const (&menu)[N]); 
template<size_t N> void Function(Menu (&menu)[N]); 
Daima çağrı Dizi adının geçmesi

dizideki diziye bir gösterici ile bozulmasına neden olur. Ancak, @hmjd cevabında dizinin büyüklüğünü de geçmeniz gerektiği için, bu seçenek size açıksa bir vektör kullanma önerisi olumludur.

0

sadece ana içinde

Function((void *) whatever_pointer_type_or_array_of_classes); 

kullanabilirsiniz.

Ve işlevinde:

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