2012-08-08 17 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 *[] 

और मुझे नहीं और यह करने के लिए किसी भी अन्य तरीके के साथ आ मैं इस के लिए एक समाधान नहीं मिल सकता है कर सकते हैं विशेष समस्या

बस, मैं एक सूचक के माध्यम से फ़ंक्शन के भीतर मेनू सरणी तक पहुंचने में सक्षम होना चाहता हूं। एक सूचक को एक सूचक के लिए सामान्य सूचक में क्या अंतर है?

उत्तर

9

घोषणा:

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

प्रार्थना:

Function(menu); 

हालांकि, अगर आप Function() सूचित करने के लिए कितने प्रविष्टियों सरणी में हैं की आवश्यकता होगी।

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); 

... या स्थिरांक या गैर द्वारा: यह है के रूप में सी std::array या std::vector जो उनके आकार का ज्ञान होना, आरंभ और समाप्ति उपयोग करने का सुझाव ++ -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; 
    .... 
}