我有一个名为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];发布于 2011-07-12 12:03:00
你能这样修改你的代码吗
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也是如此。如果您有不同的要求,请提供更多细节。
发布于 2011-07-12 07:07:29
在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数组生成所有初始化:)
https://stackoverflow.com/questions/6657588
复制相似问题