【发布时间】:2018-07-13 11:54:23
【问题描述】:
我正在尝试实现一个表示双向链表的类,我有一个函数createNode(),它返回一个新的Node(一个模板类),它的所有成员都已初始化。此函数将用于创建大小已知但没有数据传递给它的链表。对于大多数数据类型,这是可行的。但是,这对于没有默认构造函数的类不起作用,因为它们不能在没有参数的情况下被初始化。这是展示这一点的最小代码:
class Test // A class without a default constructor
{
public:
Test(int value) : value_{ value } { };
private:
int value_;
};
template<typename T>
struct Node
{
Node* prev;
Node* next;
T value;
};
template<typename T>
Node<T>* createNode()
{
return new Node<T>{ nullptr, nullptr, T() }; // How do I change T() so
// that I can use classes
// without default constructors?
}
int main()
{
Node<Test>* testNode = createNode<Test>();
delete testNode;
}
基本上,我的最终目标是能够创建一个链表,该链表可以保存未初始化的节点,同时跟踪哪些节点已初始化。我记得在我的一本旧教科书中阅读了一种解决此问题的方法,该方法涉及使用分配器(用于处理对象的构造/销毁),但我根本不记得确切的技术。那我该怎么办呢?
【问题讨论】:
-
与您的特定问题无关,但是如果已经有
std::list,您为什么还要滚动自己的列表类?有什么理由这样做吗? -
学习如何实现?这个链接列表显然没有任何实际用途,但了解一个链接列表的工作方式是很有价值的信息。
-
我认为你只是分配了足够的内存并使用placement new
-
您能否详细说明(也许举个例子)?
-
为一个对象
buf = new char[sizeof(T)];分配内存,然后在这个内存T* pT = new (buf) T(...);中构造它。您需要稍后自己调用析构函数。见en.cppreference.com/w/cpp/language/new
标签: c++ linked-list initialization c++14 default-constructor