[英]declaring a instance of a templte struct
我有以下节点:
template <class T>
struct ListItem
{
T value;
ListItem<T> *next;
ListItem<T> *prev;
ListItem(T theVal)
{
this->value = theVal;
this->next = NULL;
this->prev = NULL;
}
};
我必须声明此listitem的一个实例。 我知道如何声明不是模板的结构实例,如下所示:
node* x = new node;
x = head; (or whatever)
现在我该怎么办? 如果我按照上述步骤进行操作,那么我认为我应该执行以下操作:
ListItem<T>* temp = new ListItem<T>;
但是编译器给出的错误是,在行上方没有匹配的函数,并且ListItem需要1个参数。 快速帮助
您必须选择一种类型作为模板参数,然后将一个值传递给构造函数,因为没有默认值。 例如,等效于您使用非模板执行的操作是:
ListItem<double>* temp = new ListItem<double>(3.1416);
但这不仅仅是创建一个实例。 它正在创建具有动态分配的实例,并初始化一个指向其位置的指针。 如何“创建实例”将只是
ListItem<double> temp(3.1416);
但是要小心使用指向动态分配对象的原始指针。 您实际上应该在这里使用智能指针 。
请注意,您也可以为类提供默认的构造函数:
template <class T>
struct ListItem
{
T value;
ListItem<T> *next;
ListItem<T> *prev;
ListItem() : value(), next(NULL), prev(NULL) {}
ListItem(T theVal) : value(theVal), next(NULL), prev(NULL) {}
};
请注意,我已将您的原始构造函数更改为使用初始化列表,因为这是首选的初始化方法。
您需要为构造函数提供一个值!
以以下形式构造项目:
T* t = new T;
使用T
的默认构造函数。 在您的情况下,您没有提供默认的构造函数,并且明确禁止编译器生成默认的构造函数,因为您有一个带有值的构造函数。
使用该构造函数的形式为:
T* t = new T(U);
要使用代码中的具体示例:
// This will use the default constructor of ListItem<T>, which you _didn't_ provide
ListItem<T>* temp = new ListItem<T>;
// This will use single value constructor ListItem<int>(int), which you did provide.
ListItem<int>* temp = new ListItem<int>(7);
// The generic version would then be -- where T is actually default constructable
ListItem<T>* temp = new ListItem<T>(T());
例如,将值添加到int
类型的链表中要求您知道要添加什么值:
int value_to_add = 5;
ListItem<int>* temp = new ListItem<int>(value_to_add);
如果您的问题专门针对如何分配“头”节点,则通常是指向列表中第一项的指针:
// pointer, does _not_ point to an instantiated value (yet)
ListItem<int>* head = nullptr;
// in the add function:
ListItem<int>* value = new ListItem<int>(value_to_add);
// if the list was empty...
if(nullptr == head)
head = value; // head now points to the first value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.