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 数组。指向数组指针的普通指针有什么区别?

4

4 回答 4

10

宣言:

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

调用:

Function(menu);

但是,您需要告知Function()数组中有多少条目。因为这是 C++,所以建议使用std::array或者std::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
                  });
}
于 2012-08-08T14:09:38.573 回答
3

通过 const 或非常量指针

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

...或通过 const 或非 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);

于 2012-08-08T14:09:54.300 回答
3

如果你使用应该工作

 void Function(Menu * menu); 

并使用

Function(menu);  

代替

Function(&menu); 

传递数组名称会导致它衰减为指向数组中包含的类型的指针。但是,正如@hmjd 在他的回答中所说,您还需要传递数组大小,因此如果此选项对您开放,他对使用向量的建议是有利的。

于 2012-08-08T14:11:18.777 回答
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;
    ....
}
于 2012-08-08T14:18:03.923 回答