尝试创建一个包含预定义结构数组的类

时间:2011-07-11 22:46:16

标签: c++

我有一个名为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];

2 个答案:

答案 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函数并在类中声明相应的ab数组:

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。 如果您有不同的要求,请提供更多详细信息。