模板类数据类型

Template Class data type

本文关键字:数据类型      更新时间:2023-10-16

我已经创建了这个非常简单的动态列表,它是通过一个模板类实现的:

Node.h

template <class T> class Node
{
public:
    typedef T data_type;
    typedef T& reference_type;
    void setData(data_type);
    void setNextNull();
    void setNext(Node*);
    reference_type getData();
    Node* getNext();
private:
    data_type data;
    Node* next;
};
template <class T> void Node<T>::setData(data_type _data)
{
    data=_data;
}
template <class T> void Node<T>::setNextNull()
{
    next=NULL;
}
template <class T> void Node<T>::setNext(Node* _next)
{
    next=_next;
}
template <class T> typename Node<T>::reference_type Node<T>::getData()
{
    return data;
}
template <class T> typename Node<T>::Node* Node<T>::getNext()
{
    return next;
}

List.h

#ifndef LIST_H
#define LIST_H
#include <Node.h>
template <class T> class List
{
public:
    typedef Node<T> node_type;
    typedef node_type* node_pointer;
    typedef T data_type;
    typedef T& reference_type;
    List();
    void push_back(data_type);
    reference_type at(int);
    void clear();
    void swap(int,int);
    int size();
private:
    int list_size = 0;
    node_pointer head, tail;
};
template <class T> List<T>::List()
{
    head=NULL;
}
template <class T> void List<T>::push_back(data_type data)
{
    if(head == NULL) {
        head = new node_type;
        head->setData(data);
        tail = head;
    } else {
        node_pointer temp = new node_type;
        temp->setData(data);
        temp->setNextNull();
        tail->setNext(temp);
        tail = tail->getNext();
    }
    list_size++;
}
template <class T> typename List<T>::reference_type List<T>::at(int x)
{
    node_pointer pointer=head;
    for(int i=0; i<x; i++)
        pointer=pointer->getNext();
    return pointer->getData();
}
template <class T> void List<T>::clear()
{
    node_pointer pointer = head;
    for(int i=0; i<list_size; i++) {
        node_pointer temp = pointer;
        pointer=pointer->getNext();
        delete(temp);
    }
    head=NULL;
    list_size=0;
}
template <class T> void List<T>::swap(int x, int y)
{
    data_type buffer=at(x);
    at(x)=at(y);
    at(y)=buffer;
}
template <class T> int List<T>::size()
{
    return list_size;
}
#endif // LIST_H

列表与任何形式的数据类型都可以完美地工作,除非当我在构造函数中使用带有参数的类时,然后我得到这个错误:

include/Node.h错误:没有匹配的函数调用' Player::Player() '

我做错了什么?

更新1

我已经按照建议添加了一个简单的构造函数,但我得到了相同的错误

template <class T> Node<T>::Node(data_type _data)
{
    data=_data;
}

您可能还没有为Player类定义默认构造函数。只需插入一个空构造函数

Player() {}

你的问题可能会得到解决。

当你编写一个模板方法并像这样在主函数中使用它时:

Node<Player>

编译器自动调用Player类的构造函数。如果你没有在Player中定义任何构造函数,编译器将使用默认构造函数。但是,您定义的任何构造函数都将隐藏默认构造函数,并强制您使用此构造函数。

例如,构造函数

Player(string, int, int)

防止创建如下对象:

Player *p = new Player();

但是,如果没有编写构造函数,上面的代码也可以正常工作。

这就是为什么你的模板需要一个默认构造函数,如果你定义了一个参数化的构造函数

你的类Node应该有一个带T的构造函数,这样你就可以通过复制来构造你的T,而不是要求有一个默认的构造函数和复制。

你的Node类应该是:

template <class T>
class Node
{
public:
    Node(const T& data) : data(data), next(0) {}
    void setNextNull();
    void setNext(Node*);
    const T& getData() const { return data; }
    T& getData() { return data; }
    Node* getNext();
private:
    T data;
    Node* next;
};

然后对

进行变换
head = new node_type;
head->setData(data);

head = new node_type(data);