2017-03-08 1 views
0

여기에 C++ 멍청한 놈. 나는 링크드 (Linked-List) 클래스를 데이터 구조로 구현하여 학생 정보 프로그램을 만들려고합니다.templateClassName <className> t; 템플릿 클래스 인수에 클래스를 할당 할 수 없습니다.

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를 사용하고 있습니다.

그리고 나쁜 영어로 유감스럽게 생각합니다. LinkedList<Student>에서

+0

귀하의 링크 목록 가져 오기 전에 클래스 정의를 이동 또는 통화 당에서 클래스를 넣어 시도 .h 파일. – ajputnam

답변

0

는, 내부 구조체 Node은 다음과 같습니다

struct Node 
{ 
    Student elem; 
    Node *prev; 
    Node *next; 
}; 

그래서 모든 노드는 학생이 포함되어 있습니다.

그러나 Student이 인수를 사용하는 생성자가 있습니다 있습니다 :

Student(string n, string i, int s) 

을하며 인수를하지 않는 생성자가 없습니다. 당신이 new Node를 작성한다면

그래서, 컴퓨터 노드를 만들 것이며, 그 일환으로 그것은 Student를 만들 것이다, 그러나 그것은이 없기 때문에 인수가 'Student에 제공하는 것을 할 수 없다 생성자.

"삭제 된 함수"가 의미하는 바는 대략적입니다. 일반적으로 컴파일러는 Node 생성자를 만들지 만이 경우에는 컴파일러를 사용할 수 없습니다.

Node에는 생성자가 없으므로 new Node이 작동하지 않습니다.

가 가장 쉬운 그냥뿐만 아니라 Student에게 인수가없는 생성자를 제공하기 위해 여기에 수정 - 무엇인가 :

Student() 
{ 
    name = ""; 
    id = ""; 
    score = 0; 
    grade = getGrade(score); 
} 
+0

감사! 너는 그것을 잘 설명했다. –

+0

정확한 방법은'Node'에 'T'를 취하는 생성자를 추가하는 것입니다. 그리고'header'와'trailer'를'nullptr'로 만들고 실제로 header-> next 대신에 예상 노드를 가리 킵니다. – Jarod42

관련 문제