C++ 避免为集合的头节点使用空构造函数

C++ 避免为集合的头节点使用空构造函数,c++,constructor,linked-list,nodes,default-constructor,C++,Constructor,Linked List,Nodes,Default Constructor,我正在写一个集合,它是链表的一种形式,但它有一个标题节点。每个节点存储一个模板类型为T的对象。如果我不需要初始化头节点,那么我就不需要要求T有一个空构造函数。此外,我从来没有任何理由查看header节点中的对象。有没有办法让为该对象保留的内存保持未初始化状态?然后,我不需要要求客户端实现空构造函数。您可以在节点中使用联合,并仅在使用时在其中构造值。使用这种方法介于单独分配内容和为头部节点使用不同类型之间:它仍然会为未使用的内容复制内存,但它既不需要额外的分配/间接寻址,也不需要内容的默认构造函数

我正在写一个集合,它是链表的一种形式,但它有一个标题节点。每个节点存储一个模板类型为T的对象。如果我不需要初始化头节点,那么我就不需要要求T有一个空构造函数。此外,我从来没有任何理由查看header节点中的对象。有没有办法让为该对象保留的内存保持未初始化状态?然后,我不需要要求客户端实现空构造函数。

您可以在节点中使用
联合
,并仅在使用时在其中构造值。使用这种方法介于单独分配内容和为头部节点使用不同类型之间:它仍然会为未使用的内容复制内存,但它既不需要额外的分配/间接寻址,也不需要内容的默认构造函数。

我假设您知道
std::list
std::转发列表
。如果是这样,并且您仍然希望编写自己的链接列表以获得您想要的行为,那么您最好的选择是将
std::aligned_storage
与placement
new
结合使用

或者,如果您有权访问boost,您可以将该职责删除到
boot::optional


请显示一些代码,这会很有帮助。有两种方法可以做到这一点。1) 让校长和孩子们在不同的班级。2) 将值分配给堆(可为null的类型)。我更喜欢1。具体地说,我正在编写一个前向列表,其中元素可以被擦除,而不是在d之后擦除(因为迭代器在内部比它指向的位置落后一步),迭代器在元素被擦除时不会失效。它们被有效地移动到下一个有效元素(每个节点保持一个ptr_计数,就像共享的ptr一样,并且只有当该计数变为零时才会从内存中删除。当一个元素被擦除时,它的指针会指向上一个元素,因此它上面的任何迭代器都可以沿着链返回到下一个有效元素)@dspyz仅仅编写一个代理迭代器和一些可能的无助手函数不是更有意义吗?ie
erase(我的列表,我的代理)?我有严重的内存问题。在现有STL结构的基础上构建它将不可避免地需要额外的指针/内存。也就是说,如果我只保留一个共享ptr的前向列表,那么我需要额外的内存来指向计数的指针,而这种方式它可以只是节点对象的一部分。我认为我最喜欢这个答案,但我在想如何编写这种情况下的析构函数时遇到了麻烦。不幸的是,头节点不知道它是头节点。有没有办法将参数传递给析构函数,告诉它是否调用T的析构函数?我可以显式地调用T的析构函数吗?@dspyz:没有任何方法可以将与正在销毁的对象不同的参数传递给析构函数。您需要能够从对象的状态确定
联合中存储的对象类型。