初始化具有未知元素数的私有数组(C ++ 98)

时间:2015-07-14 01:59:16

标签: c++ arrays

看起来我错过了一些基本的东西,但是还没有解决它。

下面是一个片段及其相应的输出。

我想做的是:   - 声明并初始化结构数组,而不事先知道元素的数量。   - 理想情况下,数组本身及其元素数量为私有成员。

我尝试了什么:

  • 声明m_member_tab[]m_num_members为私有。
  • 创建了Init()函数,该函数初始化m_member_tab[]并计算m_num_members

结果:

  • m_member_tab[]初始化正常(见下面的输出)。
  • 但是在构造函数内部(调用Init后),m_member_tab已损坏。

    #include <iostream>
    using std::cout; using std::endl;
    
    class TArrayTest
    {
        public:
            TArrayTest();
    
        private:
            void Init();
    
            typedef struct _TMember
            {
                int m_key;
                int m_val;
            }
            TMember;
    
            TMember m_member_tab[];
            int m_num_members;
    };
    
    TArrayTest::TArrayTest()
    {
        Init();
        cout << "Ctor: Number of elements = " << m_num_members << endl;
        for( int i = 0; i < m_num_members; i++ )
        {
            cout << "Ctor: "
                << "key " << m_member_tab[i].m_key
                << " - val " << m_member_tab[i].m_val
                << endl;
        }
    };
    
    void TArrayTest::Init()
    {
        TMember m_member_tab[] =
        {
            { 1, 100 },
            { 2, 200 },
            { 3, 300 },
            { 4, 400 },
            { 5, 500 },
        };
        m_num_members = sizeof( m_member_tab ) / sizeof( TMember );
        cout << "Init: Number of elements = " << m_num_members << endl;
        for( int i = 0; i < m_num_members; i++ )
        {
            cout << "Init: "
                << "key " << m_member_tab[i].m_key
                << " - val " << m_member_tab[i].m_val
                << endl;
        }
    }
    
    int main()
    {
        TArrayTest test;
    }
    

输出:

    Init: Number of elements = 5
    Init: key 1 - val 100
    Init: key 2 - val 200
    Init: key 3 - val 300
    Init: key 4 - val 400
    Init: key 5 - val 500
    Ctor: Number of elements = 5
    Ctor: key 5 - val 32766
    Ctor: key 0 - val 0
    Ctor: key 0 - val 0
    Ctor: key -1212526907 - val 32623
    Ctor: key 0 - val 0

3 个答案:

答案 0 :(得分:3)

此会员声明:

    TMember m_member_tab[];

无效C ++。

init函数中还有一个问题,你声明了一个同名的局部变量,但这并不重要:上述声明不仅无效,而且因为它&#39 ; s不在结构的末尾,它作为一种语言扩展甚至没有意义。

相反,请使用std::vector,如下所示:

    std::vector<TMember> m_member_tab;

它会跟踪数组大小,因此您不需要额外的成员。

在其他新闻中,C ++直接支持类实例的初始化。你不应该为此定义普通函数。而是使用语言机制,即构造函数

您可以在任何教程和任何介绍性C ++教科书中找到有关构造函数的信息。

init函数相比,支持语言的机制具有许多优点。

哦,看到数组中的每个项目都包含一个键和一个值,请考虑std::map,或者,如果你可以使用C ++ 11而不仅仅是C ++ 98 / C03, std::unordered_map(更快但没有按键排序遍历)。

答案 1 :(得分:1)

在void TArrayTest :: Init()的第一行:

TMember m_member_tab[] =
{
    { 1, 100 },
    { 2, 200 },
    { 3, 300 },
    { 4, 400 },
    { 5, 500 },
};

你声明“m_member_tab”是一个临时变量,而不是成员变量。你应该这样写:     m_member_tab [] =     {         {1,100},         {2,200},         {3,300},         {4,400},         {5,500},     };

答案 2 :(得分:1)

您尝试使用的功能在C ++语言中不存在。在非静态成员数组声明中使用[]是非法的。它在静态成员数组声明中是允许的,但在非静态成员数组声明中是允许的。

即使您的编译器以某种方式允许此声明,它也可能将其解释为零大小的数组。数组大小固定在那一点 - 以后无法以某种方式将它“初始化”为更大的数组。

某些编译器可能允许使用[]的成员数组声明作为支持C风格"struct hack"的方法。但这是一种完全不同的技术。