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