我有一个名为CoolMenuItems的课程
class CoolMenuItems
{
public:
CoolMenuItems();
~CoolMenuItems();
struct MenuItemOne
{
int id;
uint32 type;
uint32 subtype;
String name;
};
struct MenuItemTwo
{
uint32 subtype;
String name;
};
}
这只是该类的基础......我想拥有两个数组,一个是MenuItemOne,另一个是MenuItemTwo,这些数组将具有以下内容。我想要初始化的这些数组如下:
MenuItemOne a[] =
{
{1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")},
{2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS, EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")},
};
MenuItemTwo b[] =
{
{EQData::EQ_FILTER_TYPE_TRHU, T("Thru")},
{EQData::EQ_FILTER_TYPE_BUTTERWORTH_6DB, T("6 dB Butterworth")},
};
只有更多元素而不仅仅是两个...
我想设置它以便我可以用
创建一个新的CoolMenuItems对象CoolMenuItems *cmi = new CoolMenuItems();
这样我就可以通过
访问这些数组元素了cmi->a[1];
答案 0 :(得分:0)
在C ++中初始化成员变量有点棘手,所以我的建议如下:
MenuItemOne& ret_a(int i)
{
static MenuItemOne a[] =
{
// definition of a[]
};
return a[i]; // maybe with some bounds checking
}
请注意,这有一些优点。首先,在类方法中将数组a
声明为static
使其全局定义一次。其次,您隐藏了方法调用后面的实际a[]
数组,这是一种更好的设计实践。
修改强>
由于数组不能是静态的,因为值依赖于其他一些库,所以必须在某些时候设置值,比如CoolMenuItems
构造函数:
CoolMenuItems::CoolMenuItems()
{
for (int i = 0; i < A_ITEMS; ++i)
{
a[i].id = X;
a[i].name = T("xxx");
}
// ...
}
或者,如果您必须手动输入值:
CoolMenuItems::CoolMenuItems()
{
a[0].id = X;
a[0].name = T("xxx");
a[1].id = ...
// ...
}
这很乏味,但可以通过一些编辑器使用或预处理器自动完成。另请注意,您必须类似地声明ret_a
函数并在类中声明相应的a
和b
数组:
MenuItemOne a[A_ITEMS];
MenuItemTwo b[B_ITEMS];
如果有足够的时间,我会给你一个很好的elisp宏来在emacs中使用,从你编写的C数组中生成所有的初始化:)
答案 1 :(得分:0)
你可以像这样修改你的代码吗
class CoolMenuItems
{
public:
CoolMenuItems();
~CoolMenuItems();
struct MenuItemOne
{
int id;
uint32 type;
uint32 subtype;
String name;
};
struct MenuItemTwo
{
uint32 subtype;
String name;
};
std::vector<MenuItemOne> menuItemOne;
std::vector<MenuItemTwo> menuItemTwo;
}
这样你就可以将struct和push_back的元素初始化为std :: vector,所有要分配和释放的内存都将由std :: vector
处理。MenuItemOne a = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0,T("Parametric")};
menuItemOne.push_back(a);
同样适用于MenuItemTwo。 如果您有不同的要求,请提供更多详细信息。