如何使用模板类作为参数
How to use a template class as argument?
我在使用模板时遇到了困难,想寻求一些帮助。
首先,我正在实现一个动态列表,其中节点的"数据"可用于指向我需要的任何内容。它是所有应用程序的通用列表,我发现制作它的方式是使用模板。
这是我实现它的 .h:
#ifndef DYNAMICLIST_H_
#define DYNAMICLIST_H_
// **** Node ****
template <typename T>
class Node
{
public:
Node(int _nodeID, T* _data)
{
nodeID = _nodeID;
next = NULL;
data = _data;
}
Node()
{
}
~Node()
{
if(data)
delete data;
}
//sets e gets
Node* GetNext() const
{
return next;
}
void SetNext(Node* _next)
{
next = _next;
}
int GetNodeID() const
{
return nodeID;
}
T* GetNodeData() const
{
return data;
}
void SetData(T* _data) //provavelmente não será usada
{
data = _data;
}
private:
int nodeID; //numero usado na busca
Node* next; //ponteiro pro proximo node
T* data; //ponteiro pra uma imagem, uma mensagem, um som, o que quer que seja que precisar ser guardado
};
// **** DynamicList ****
class DynamicList
{
public:
DynamicList(Node* _node)
{
this->SetHead(_node);
}
~DynamicList()
{
this->DeleteList();
}
//sets e gets
Node* GetHead() const
{
return head;
}
void SetHead(Node* _head)
{
head = _head;
}
Node* GetNode(int _nodeID) const
{
Node *Finder;
if (!head)
return false;
Finder = head;
for (; Finder; Finder = Finder->GetNext())
{
if (Finder->GetNodeID() == _nodeID) //se o nome for igual, retorna o ponteiro do node
return Finder;
}
return false;
}
void NewNode (Node* _node) // Método para adicionar um elemento novo ao final da lista.
{
if (!this->GetHead())
{
this->SetHead(_node);
}
else
{
Node *Finder = this->GetHead();
while (Finder->GetNext())
Finder = Finder->GetNext();
Finder->SetNext(_node);
}
}
//outras
bool Delete(int _nodeID)
{
Node* deleter;
Node* aux;
if(!this->GetNode(_nodeID) ) //não há mensagem com esse Id na lista
return false;
if(head->GetNodeID() == _nodeID)
{
if (!head->GetNext()) //se não houver outro nó além da head, não deletar
{
delete head;
head = NULL;
}
else
{
aux = head->GetNext(); //se head tiver a mensagem a ser deletada, head agora aponta para o nó seguinte
delete head;
head = aux;
return true;
}
}
else
{
deleter = head;
while (deleter) //enquanto não chegar no fim
{
if (deleter->GetNext()) //se há um próximo node
{
if (deleter->GetNext()->GetNodeID() == _nodeID) //verifica se o próximo tem a node mensagem procurada
{
aux = deleter->GetNext()->GetNext(); //caso tenha, perde o ponteiro do proximo node e pega o do seguinte
delete deleter->GetNext();
deleter->SetNext(aux);
return true;
}
}
deleter = deleter->GetNext(); //passa para o próximo
}
return false;
}
}
void DeleteList()
{
Node* superDeleter;
Node* aux;
superDeleter = head;
if(!superDeleter)
return;
else
{
while(superDeleter->GetNext()) //se há um próximo node
{
aux = superDeleter->GetNext(); //guarda o proximo
delete superDeleter; //deleta o primeiro
superDeleter = aux; //aponta para o proximo
}
delete superDeleter; //deleta o ultimo restante
}
}
private:
Node* head;
};
#endif
我的目的是使用模板使数据成为通用指针,以将类保留在队列中。检查类中的方法。他们中的大多数使用 Node*,我通过使其成为模板来诅咒它。现在,如果不在声明中指定类型,就无法使用 Node*?有没有办法声明 Node* 以便我可以在此方法中使用它?我最大的问题是在方法中我无法指定节点模板,它应该适用于所有类型。
谢谢。
我最大的问题是在方法中我无法指定节点模板,它应该适用于所有类型
是的,您可以:只需将DynamicList
也制作为模板,然后使用Node<T>*
。这样,它将适用于所有类型。
相关文章:
- 何时应在构造函数参数中使用 const C++?
- 概念可以与模板模板参数一起使用吗?
- 如何在模板参数中使用 std::is_pod?
- 在模板参数中使用 {} 在 type_trait{} 中时,其作用是什么<T>?
- 可变参数模板参数转发使用逗号运算符
- 在模板函数参数中使用 std::bind
- 函数参数中使用的复杂文字'i'
- 设置内核参数时使用CL_INVALID_ARG_SIZE
- 为什么当我尝试将priority_queue与参数一起使用作为指向结构的指针时会弹出错误
- 标准::原子::compare_exchange与两个memory_order参数一起使用的真实示例
- 如何在 C++ 中将 typedef 与类初始值设定项参数一起使用?
- 在命令行参数中使用引号
- 对可变参数模板使用 const 参数
- SFINAE 和模板函数实例化:为什么在启用了 SFINAE 类型的函数参数中使用模板参数时无法推断模板参数?
- 在简单地移动参数时使用函数模板参数的优点
- 如何切片可变参数模板参数并使用它们?
- 我可以将"token pasting operator"与"const"模板参数一起使用吗?
- 哪个强制转换应与模板类参数一起使用,dynamic_cast或reinterpet_cast?
- 在模板参数中使用 ref<>?
- 保留短 lambda 用作函数的中间参数,使用 clang 格式保持不变