2012-08-08 49 views
5

Trong chức năng chính của tôi, tôi tạo một mảng đối tượng của một lớp nhất định "Menu"Tham số chức năng: Con trỏ tới mảng đối tượng

Và khi tôi gọi hàm tôi muốn cung cấp con trỏ tới mảng đó.

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

Câu hỏi: Cách viết chính xác các thông số chức năng là gì?

tôi cố gắng:

Function(&menu); 

và trong header file:

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

và tôi không thể đưa ra bất kỳ cách nào khác để làm điều này và tôi không thể tìm thấy một giải pháp này Vấn đề cụ thể.

Đơn giản, tôi muốn có thể truy cập mảng Menu trong hàm thông qua con trỏ. Sự khác biệt trong con trỏ bình thường với một con trỏ đến một mảng là gì?

Trả lời

9

Tuyên bố:

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

Invocation:

Function(menu); 

Tuy nhiên, bạn sẽ cần phải thông báo cho Function() bao nhiêu mục nằm trong mảng. Vì đây là C++ đề nghị sử dụng std::array hoặc std::vector đó có kiến ​​thức về kích thước của chúng, bắt đầu và kết thúc:

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

Hoặc bởi const hay không const pointer

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

... hoặc bằng const hoặc không tham chiếu -const

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

có thể được khái quát hóa thành mẫu để kích thước mảng sẽ được trình biên dịch:

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

Luôn gọi như Function(menu);

3

nên có tác dụng nếu bạn sử dụng

void Function(Menu * menu); 

và gọi sử dụng

Function(menu); 

thay vì

Function(&menu); 

truyền tên mảng làm cho nó phân rã thành con trỏ thành kiểu chứa trong mảng. Tuy nhiên, như @hmjd nói trong câu trả lời của mình, bạn cũng sẽ cần phải vượt qua kích thước mảng, vì vậy đề xuất của ông về việc sử dụng một véc tơ là thuận lợi nếu tùy chọn này được mở cho bạn.

0

Bạn có thể sử dụng

Function((void *) whatever_pointer_type_or_array_of_classes); 

trong chính bạn.

Và trong hàm:

type Function(void * whatever) 
{ 
    your_type * x =(your_type *) whatever; 
    //use x 
    .... 
    x->file_open=true; 
    .... 
} 
Các vấn đề liên quan