首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试创建一个包含预定义的结构数组的类

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

Stack Overflow用户
提问于 2011-07-12 06:46:16
回答 2查看 1.1K关注 0票数 0

我有一个名为CoolMenuItems的类

代码语言:javascript
复制
class CoolMenuItems
{
public:
    CoolMenuItems();
    ~CoolMenuItems();

    struct MenuItemOne
    {
        int id;
        uint32 type;
        uint32 subtype;
        String name;
    };

    struct MenuItemTwo
    {
        uint32 subtype;
        String name;
    };
}

这只是这个类的最基本的部分。我希望有两个数组,一个是MenuItemOne数组,另一个是MenuItemTwo数组,这些数组将包含以下内容。这些我想要初始化的数组如下:

代码语言:javascript
复制
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对象

代码语言:javascript
复制
CoolMenuItems *cmi = new CoolMenuItems();

这样我就可以通过

代码语言:javascript
复制
cmi->a[1];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-12 12:03:00

你能这样修改你的代码吗

代码语言:javascript
复制
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负责

代码语言:javascript
复制
MenuItemOne a = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0,T("Parametric")};

menuItemOne.push_back(a);

MenuItemTwo也是如此。如果您有不同的要求,请提供更多细节。

票数 0
EN

Stack Overflow用户

发布于 2011-07-12 07:07:29

在C++中,成员变量的初始化有些棘手,因此我的建议如下:

代码语言:javascript
复制
MenuItemOne& ret_a(int i)
{
    static MenuItemOne a[] =
    {
        // definition of a[]
    };
    return a[i]; // maybe with some bounds checking
}

请注意,这有一些优点。首先,在类方法中将数组a声明为static使其只需全局定义一次。其次,将实际的a[]数组隐藏在方法调用后面,这是一种更好的设计实践。

编辑

由于数组不能是静态的,因为值依赖于其他库,所以必须在某个时候设置值,比如CoolMenuItems构造函数:

代码语言:javascript
复制
CoolMenuItems::CoolMenuItems()
{
    for (int i = 0; i < A_ITEMS; ++i)
    {
       a[i].id = X;
       a[i].name = T("xxx");
    }   
    // ...
}

或者,如果您必须手动输入值:

代码语言:javascript
复制
CoolMenuItems::CoolMenuItems()
{
    a[0].id = X;
    a[0].name = T("xxx");
    a[1].id = ...   
    // ...
}

这很繁琐,但可以通过使用一些编辑器或预处理器来实现自动化。还要注意,您必须以类似的方式声明ret_a函数,并在类中声明相应的ab数组:

代码语言:javascript
复制
MenuItemOne a[A_ITEMS];
MenuItemTwo b[B_ITEMS];

如果有足够的时间,我将为您提供一个很好的elisp宏,用于在emacs中从您编写的C数组生成所有初始化:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6657588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档