2011-11-21 56 views
2

我是一个中间的Java程序员和我习惯在java中对空值中继用于如果OBJETS与在存储器中的某些参考实例化对象初始化cheking。我想在C++中做类似的事情,但我对如何实现它没有清晰的认识。我想初始化一个用户数组 - user是我定义的一个类 - 所以我可以检查数组中的实际位置确实包含一个对象还是空闲的。初始化C中的对象阵列++具有特殊值

我曾尝试使用空定义在C++中却发现,这是一个简单的“-1” int值,我无法正确地使用它。所以基本上我需要一些东西来区分阵列中的一个自由位置和一个自由位置。

此外,我可能有兴趣有一个额外的价值来区分一个位置,其中包含一个被删除的用户,因为我打算只标记所需的位置与特殊标记作为释放的位置,当涉及到删除的方法来自阵列的用户。

对于那些好奇,我实现一个简单的哈希集合,并在我的课remove方法只是标记元素的位置移除,而不是做一些restruction。

+0

谢谢parapura费道宜,本杰明·林德利和阿德里安深为帮助和信息。这正是我一直在寻找的。 fileoffset,我不允许使用除C++标准模板库以外的任何内容。 –

+0

如果你正在寻找什么,如果你可以选择最好的答案并接受它,那将会很棒。它不仅鼓励回答者,而且使未来的参考更容易 –

+0

“我想在C++中做类似的事情......”。别。不要将C++编码为Java。它们的优化方式不同,而且您的代码运行速度非常慢,而且会是令人难以置信的错误。 –

回答

0

我觉得有一些概念需要了解。

与Java不同,当您创建用户的N元素数组时,它不是一个引用数组。它实际上是一段包含实际N用户的内存,它已经被创建和初始化(即构造函数已经运行)。 (好吧,还有更高级的主题,比如展示位置 - 新的,但我认为它并不是你真正需要的东西)

所以它有点矛盾,如果你说你有一个“用户数组”并且想保持追踪某个位置是否被初始化。

除非:

  1. 没有创建用户的阵列,但“指向用户”(或其他参考的auto_ptr等)的阵列。通过这种方式,说某个元素是“null”是有意义的;或

  2. 您的“初始化”并不意味着创建一个对象实例,而是一个显式的初始化操作(如执行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是不是真的,你在找什么)

1

所有空的定义首先不为-1,但0假设你有类似

class User 
{ 
}; 

User RemovedClass; 

,你可以有这样的事情

User *arr[3]; 
arr[0] = new User(); 
arr[1] = 0; 
arr[2] = &RemovedClass; 

这里是新用户, 是用java空当量,为删除的类标记。

EDIT

通常当看到用户阵列中的java 你将不得不将其映射到一个用户*阵列在C++中。

这些操作之后。

User a; 
User b; 
a = b; 

在Java a和b将是指相同的用户。在C++中,这样的代码将屈服于a和b引用两个不同的用户对象。

+1

arr是用户数组,而不是用户指针数组。 –

+0

在java中,一切都是参考。在C++中,如果您有**用户**对象而不是**用户***,则不能将其设置为零,除非您愿意在**用户**中拥有存储该用户是否为空或已删除的成员 –

+0

对,我明白了。我的观点是,你将arr声明为一个用户数组的指针,然而你正在为它的元素分配地址。除非元素是指针,否则将地址分配给元素是没有意义的。 –

0

我使用boost ::可选:

boost::optional<int> a; 

if (!a) { std::cout << "no a!"; } 

a = 5; 

if (a) { std::cout << "a = " << *a; } 

a = boost::none; 

if (!a) { std::cout << "no a!"; }