看起来我错过了一些基本的东西,但是还没有解决它。
下面是一个片段及其相应的输出。
我想做的是: - 声明并初始化结构数组,而不事先知道元素的数量。 - 理想情况下,数组本身及其元素数量为私有成员。
我尝试了什么:
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
答案 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"的方法。但这是一种完全不同的技术。