C ++ noob。我试图通过实施创建学生信息计划 Linked-List类作为其数据结构。
LinkedList.h
#pragma once
#include <stdexcept>
template <typename T>
class LinkedList
{
private:
struct Node
{
T elem;
Node *prev;
Node *next;
};
Node *header;
Node *trailer;
int size;
public:
LinkedList()
{
header = new Node;
trailer = new Node;
header->next = trailer;
trailer->prev = header;
}
~LinkedList()
{
while (!isEmpty())
removeFirst();
delete header;
delete trailer;
}
const int& n_elem() const
{
return size;
}
const bool isEmpty() const
{
return size == 0;
}
const T& getFirst() const
{
if (isEmpty())
throw std::out_of_range("List is empty.");
return header->next->elem;
}
const T& getLast() const
{
if (isEmpty())
throw std::out_of_range("List is empty.");
return trailer->prev->elem;
}
void addFirst(const T& item)
{
addBetween(item, header, header->next);
}
void addLast(const T& item)
{
addBetween(item, trailer->prev, trailer);
}
void addAt(int index, const T& item)
{
Node *node = header;
for (int i = 0; i < index; i++)
node = node->next;
addBetween(item, node, node->next);
}
const T removeFirst()
{
if (isEmpty())
throw std::out_of_range("List is empty.");
return remove(header->next);
}
const T removeLast()
{
if (isEmpty())
throw std::out_of_range("List is empty.");
return remove(trailer->prev);
}
const T removeAt(int index)
{
if (isEmpty())
throw std::out_of_range("List is empty.");
Node *node = header;
for (int i = 0; i < index; i++)
node = node->next;
return remove(node->next);
}
const T& itemAt(int index) const
{
if (isEmpty())
throw std::out_of_range("List is empty.");
Node *node = header;
for (int i = 0; i < index; i++)
node = node->next;
return node->next->elem;
}
protected:
void addBetween(const T& item, Node *predecessor, Node *successor)
{
Node *newest = new Node;
newest->prev = predecessor;
newest->next = successor;
predecessor->next = newest;
successor->prev = newest;
size++;
}
const T remove(Node *node)
{
Node *predecessor = node->prev;
Node *successor = node->next;
predecessor->next = successor;
successor->prev = predecessor;
T oldItem = node->elem;
size--;
delete node;
return oldItem;
}
};
学生班定义如下。
Program.cpp
#include "stdafx.h"
#include <iostream>
#include <string>
#include "LinkedList.h"
using namespace std;
class Student
{
public:
string name;
string id;
int score;
static const int total = 100;
double grade;
Student(string n, string i, int s)
{
name = n;
id = i;
score = s;
grade = getGrade(score);
}
private:
double getGrade(int score)
{
return (23.0 / 3.0 - ((20.0 * score) / (3.0 * total)));
}
};
LinkedList<Student> l;
int main()
{
//Some code here
return 0;
}
我不知道原因
LinkedList<Student> l;
产生错误:
LinkedList<Student>::Node::Node(void)': attempting to reference a deleted function
但是当我使用时:
LinkedList<Student*> l;
没有错误。
请帮忙。 我正在使用Visual Studio 2015。
抱歉英语不好。
答案 0 :(得分:0)
在LinkedList<Student>
中,内部结构Node
如下所示:
struct Node
{
Student elem;
Node *prev;
Node *next;
};
所以每个节点都包含一个学生。
但是,您要注意Student
有一个带参数的构造函数:
Student(string n, string i, int s)
并且它没有不带参数的构造函数。
因此,如果您要编写new Node
,计算机将创建一个节点,作为其中的一部分,它将创建一个Student
,但它不能这样做,因为它不会#&# 39; t有任何论据可以提供给Student
的构造函数。
那是(大约)什么&#34;删除功能&#34;这意味着 - 通常编译器会为你创建一个Node
构造函数,但在这种情况下它不能。
因此new Node
无效,因为Node
没有构造函数。
这里最容易解决的问题可能就是给Student
一个无参数的构造函数 - 比如:
Student()
{
name = "";
id = "";
score = 0;
grade = getGrade(score);
}