我觉得有一些概念需要了解。
与Java不同,当您创建用户的N元素数组时,它不是一个引用数组。它实际上是一段包含实际N用户的内存,它已经被创建和初始化(即构造函数已经运行)。 (好吧,还有更高级的主题,比如展示位置 - 新的,但我认为它并不是你真正需要的东西)
所以它有点矛盾,如果你说你有一个“用户数组”并且想保持追踪某个位置是否被初始化。
除非:
没有创建用户的阵列,但“指向用户”(或其他参考的auto_ptr等)的阵列。通过这种方式,说某个元素是“null”是有意义的;或
您的“初始化”并不意味着创建一个对象实例,而是一个显式的初始化操作(如执行User实例的init()方法)。通过这种方式,说某个元素“未初始化”是有意义的。
(首先,因为你正在编写C++,我会建议你使用std :: vector的,而不是数组。但是我使用数组中的这个答案,从而关闭坚持你的问题)
对于情况1,它是严格向前,简单地使用NULL(避免使用0,因为尽管NULL在大多数系统被定义为0,使用NULL实际上使代码的可读性和更便携的):
User* user[10] = {NULL}; // array of 10 pointer-to-User
user[0] = new User(...);
assert (user[0] != NULL);
assert (user[1] == NULL);
对于案例2,您有许多其他选择,例如保持另一个布尔数组以保持“登陆“标志,或者在用户身上包装这种额外标志的包装,或者简单地将此标志添加到您的用户类别中,等等。
例如,
User user[10]; // 10 element of User, which all of them is already created
//assume you have extra flag in User
user[0].init(...); // explicity do some init work on user[0]
//......
if (! user[5].isInitialized()) {
user[5].init(...);
}
(老实说,我认为情况2是不是真的,你在找什么)
谢谢parapura费道宜,本杰明·林德利和阿德里安深为帮助和信息。这正是我一直在寻找的。 fileoffset,我不允许使用除C++标准模板库以外的任何内容。 –
如果你正在寻找什么,如果你可以选择最好的答案并接受它,那将会很棒。它不仅鼓励回答者,而且使未来的参考更容易 –
“我想在C++中做类似的事情......”。别。不要将C++编码为Java。它们的优化方式不同,而且您的代码运行速度非常慢,而且会是令人难以置信的错误。 –