2011-07-11 35 views
0

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

这里有什么具体问题?哪部分会给你带来麻烦? –

+2

您是否希望每个CoolMenuItems都具有单独的菜单项副本(可能是因为它们可能会被更改),还是有一个CoolMenuItems应指向的菜单项的一个不可变副本? – antlersoft

+0

@Oli我无法得到我的解决方案来编译......我认为我对这门语言不够熟悉。具体来说,我正在寻找功能在我的问题的最后,与某种实施。 –

回答

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; 
} 

这样就可以初始化的结构元素和的push_back结构体的初始化入的std ::向量,来分配所有的内存和被释放将由性病被照顾:: vector的

MenuItemOne a = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0,T("Parametric")}; 

menuItemOne.push_back(a); 

同样,对于MenuItemTwo。 如果您有不同的要求,请给出更多的细节。

+0

这将是一个很好的解决方案,但是您只能初始化那个结构。之后,您需要在调用push_back之前手动设置结构的元素。 –

+0

为什么?请举例说明。我认为你不需要手动设置元素。 –

0

访问这些数组元素构件变量的初始化在C++中稍微有点棘手,所以我的建议将如下所示:

MenuItemOne& ret_a(int i) 
{ 
    static MenuItemOne a[] = 
    { 
     // definition of a[] 
    }; 
    return a[i]; // maybe with some bounds checking 
} 

请注意,这有一些优点。首先,在类方法中声明数组astatic,使其全局定义一次。其次,在方法调用后面隐藏实际的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 = ... 
    // ... 
} 

这很乏味,但可以通过一些e ditor用法或预处理器。还要注意的是,你再有类似的声明ret_a函数和类中声明相应的ab阵列:

MenuItemOne a[A_ITEMS]; 
MenuItemTwo b[B_ITEMS]; 

有足够的时间,我会给你一个很好的elisp宏来的emacs内使用生成所有从C数组你写:)

+0

我无法将结构体的MenuItem数组设置为静态,因为它们包含JUCE库中的字符串,必须使用依赖于JUCE应用程序设置的特定宏进行转换,但静态内存对象在main()被执行,所以这是导致我悲伤... –

+0

@Colton,如果是这种情况,你必须以编程方式初始化值,比如在类的构造函数中,因为这些数组(无论是否为静态)必须是用常数数据初始化。我正在用这些知识编辑我的答案。 –

+0

@Colton:全局变量和类静态成员在'main'之前初始化,但是本地静态变量@Diego建议在第一次调用'ret_a()'之前不会被初始化。 –

相关问题