没有初始大小的C ++中的const数组初始化

时间:2014-06-11 14:46:15

标签: c++ arrays derived-class

我在父类中有一个方法可以执行此操作:

HWND SppTab::CreateToolTip(HWND hDlg)
{
    LRESULT  added, active;
    const int Controls[] = {
        /* Audio Tab (IDD_AUDIO ) */
        IDC_AUD_AUTO, IDC_AUD_8, IDC_AUD_16, IDC_CH_AUTO, IDC_LEFT, IDC_RIGHT, IDC_LEVEL_L, IDC_LEVEL_R, IDC_LEVEL_M,

        /* Transmitter Tab (IDD_DECODE) */
        IDC_DEC_AUTO, IDC_BTN_SCAN, IDC_LIST_PPM, IDC_LIST_PCM, 
        IDC_CH1, IDC_CH2, IDC_CH3, IDC_CH4, IDC_CH5, IDC_CH6, IDC_CH7, IDC_CH8, IDC_CH9, IDC_CH10, IDC_CH11, IDC_CH12, IDC_CH13, IDC_CH14, IDC_CH15, IDC_CH16
    };

       // Loop on all controls that require tooltip
       for (auto ctrl : Controls)
       {
           HWND hwndTool = GetDlgItem(hDlg, ctrl);
           toolInfo.uId = (UINT_PTR)hwndTool;
           added = SendMessage(m_hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
           active = SendMessage(m_hwndToolTip, TTM_ACTIVATE, TRUE, (LPARAM)&toolInfo);
       };
   }

   return m_hwndToolTip;
}

派生方法之间的唯一区别是数组Controls []的内容。 似乎数组应该是派生类的成员,并且将以不同方式初始化。请注意,数组大小不固定。

如何初始化一个类成员的数组? 我知道我可以定义全局数组(对于每个类)并在构造函数中分配它们。这是最好的方式吗?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++

嗯,您始终可以定义全局数组const int g_RawBarId[] = {IDC_CH1,IDC_CH2,IDC_CH3,IDC_CH4,IDC_CH5,IDC_CH6,IDC_CH7,IDC_CH8,\ IDC_CH9,IDC_CH10,IDC_CH11,IDC_CH12,IDC_CH13,IDC_CH14,IDC_CH15,IDC_CH16}; 然后将它分配给构造函数中的向量: m_vRawBarId(g_RawBarId, g_RawBarId+sizeof(g_RawBarId)/ sizeof(int)) 然而,使用全局变形感觉就像破坏了OO游戏的规则。 如果你有更好的想法 - 一个例子将是非常宝贵的。

2 个答案:

答案 0 :(得分:2)

由于您的数组似乎是仅用于控制CreateToolTip()所做的常量数据,因此最谨慎的方法是将两个(或更多)数组定义为静态常量并使用指针CreateToolTip()中的一个或另一个。

这样可以避免不必要的数据复制,不必要的数组初始化,不必要的内存分配以及尝试处理变量数组大小的不必要的痛苦。

答案 1 :(得分:0)

在类构造函数中初始化此成员数组可能是正确的。我想没有最好的方法。如果你做得恰到好处,所有人都会得到相同的结果。

如果您使用的是C ++ 11,则可以在类定义中初始化成员。但是如果使用动态内存,那么我建议首先在构造函数中提供最小内存,然后根据需要增加。

此外,数组大小未知,因此您可以使用动态成员数组分配。

使用C中的malloccalloc以及C ++中的new完成。

或者,您可以使用一些管理动态内存分配的数据类型,其示例在C ++中为std::vector