C++ 使用未知数量的元素(C+;+;98)初始化专用数组

C++ 使用未知数量的元素(C+;+;98)初始化专用数组,c++,arrays,C++,Arrays,看起来我错过了一些基本的东西,但还没有解决 下面是一个代码段及其相应的输出 我想做的是: -声明并初始化结构数组,而不事先知道元素的数量。 -理想情况下,数组本身及其元素数是私有成员 我尝试的是: 声明m_成员选项卡[]和m_成员数为私有 创建了一个Init()函数,该函数初始化m_成员选项卡[]并计算m_成员数 结果: m_成员_选项卡[]初始化正常(参见下面的输出) 但在构造函数内部(调用Init)后,m_member_选项卡已损坏 #include <iostream>

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

下面是一个代码段及其相应的输出

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

我尝试的是:

  • 声明
    m_成员选项卡[]
    m_成员数
    为私有
  • 创建了一个
    Init()
    函数,该函数初始化
    m_成员选项卡[]
    并计算
    m_成员数
结果:

  • m_成员_选项卡[]
    初始化正常(参见下面的输出)
  • 但在构造函数内部(调用
    Init
    )后,
    m_member_选项卡
    已损坏

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

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

    您将“m_member_tab”声明为临时变量,而不是成员变量。你应该这样写: m_成员_选项卡[]= { { 1, 100 }, { 2, 200 }, { 3, 300 }, { 4, 400 }, { 5, 500 },
    };

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

    您将“m_member_tab”声明为临时变量,而不是成员变量。你应该这样写: m_成员_选项卡[]= { { 1, 100 }, { 2, 200 }, { 3, 300 }, { 4, 400 }, { 5, 500 },
    };

    本成员声明:

        TMember m_member_tab[];
    

    不是C++,

    init
    函数中还有一个问题,您可以声明一个同名的局部变量,但这并不重要:上面的声明不仅无效,而且因为它不在结构的末尾,所以作为一个语言扩展,它甚至没有意义

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

        std::vector<TMember> m_member_tab;
    
    std::vector m_member_选项卡;
    
    它跟踪数组大小,因此不需要额外的成员


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

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

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



    哦,当数组中的每个项都包含一个键和一个值时,请考虑一个代码> STD::MAP<代码>,或者,如果你可以使用C++ 11而不是C++ 98/C03,<代码> STD::unOrdEdjMault/Cuff>(更快但没有排序遍历键)。

        TMember m_member_tab[];
    

    不是C++,

    init
    函数中还有一个问题,您可以声明一个同名的局部变量,但这并不重要:上面的声明不仅无效,而且因为它不在结构的末尾,所以作为一个语言扩展,它甚至没有意义

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

        std::vector<TMember> m_member_tab;
    
    std::vector m_member_选项卡;
    
    它跟踪数组大小,因此不需要额外的成员


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

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

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



    哦,当数组中的每个项目都包含一个关键字和一个值时,请考虑一个代码> STD::MAP<代码>,或者,如果你可以使用C++ 11而不是C++ 98/C03,<代码> STD::unOrdEdjPoMAs(更快但没有排序遍历键)。

    < P>你在使用的特征不存在于C++语言中。在非静态成员数组声明中使用
    []
    是非法的。它在静态成员数组声明中是允许的,但在非静态成员数组声明中是非允许的

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


    某些编译器可能允许使用
    []
    的成员数组声明来支持C风格。但这是一种完全不同的技术[]是非法的。它在静态成员数组声明中是允许的,但在非静态成员数组声明中是非允许的

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


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

    谢谢。看起来唯一的方法(如果我需要坚持使用C++98)是声明一个struct的公共数组。然后在实现文件中(类本身之外),我可以在不知道项数的情况下初始化数组(遵循C99语法)。这是可行的,但我真正不喜欢的是数组本身(以及结构类型)必须是公共的。上面有一个建议使用vector。但是我还没有找到一种初始化结构向量的方法,就像我对C99数组所做的那样(也就是说,在不知道元素数量的情况下)。@artm:Um。。。我看不出公开数组会有什么不同。如上所述,只要数组仍然是类的非静态成员,就不可能“重新定义”元素的数量。谢谢。看起来唯一的方法(如果我需要坚持使用C++98)是声明一个struct的公共数组。然后在实现文件中(类i之外