2015-09-21 2 views
-1

Я пытаюсь закодировать программу, которая подсказывает пользователю, что информация, которую они вводят, дублируется. Но Dev-C++ продолжает говорить мне «класс Student» не имеет никакого элемента с именем «р», поэтому я предполагаю, что есть что-то не так с алгоритмом или код, пожалуйста, посмотрите:алгоритм поиска дублированной информации?

Student.h

#ifndef STUDENT_H_ 
#define STUDENT_H_ 

#include "Person.h" 

class Student: public Person { 
    int ent_year; 
    string major; 
    public: 
     Student *next; 
     Student(); 
     Student (int i_pid, string i_fname, string i_dob, string i_addr, int i_ent_year, string i_major); 
     void Show(); 

     void Set_ent_year (int i_ent_year); 
     void Set_major(string i_major); 

     int Get_ent_year(); 
     string Get_major(); 
}; 

#endif 

StudentList.h

#ifndef STUDENTLIST_H_ 
    #define STUDENTLIST_H_ 

    #include "Student.h" 

    class StudentList { 
     private: 
      Student *head, *tail; 

     public: 
      Student p; 
      Student *next; 
      StudentList(); 

      void SList_Init(); 
      void AddTail (Student *p); 
      void SubString (string s); 
      void ListShow(); 
      void ReadFile(); 
      void findID(); 
      void findName(); 
      void findDOB(); 
      void findAddr(); 
      void findMajor(); 
      void findEY(); 
      void changeName(); 
      void changeDOB(); 
      void changeAddr(); 
      void changeMajor(); 
      void changeEY(); 
      void Add_Student(); 

      bool is_duplicate(Student t); 
    }; 

    void Open_file (string file_name); 
    void Close_file(); 

    #endif 

.cpp файл

bool equalStudent(Student s1, Student s2) 
{ 
    return (s1.Get_ent_year() == s2.Get_ent_year()) 
      && ((s1.Get_addr()).compare(s2.Get_addr()) == 0) 
      && ((s1.Get_dob()).compare(s2.Get_dob()) == 0) 
      && ((s1.Get_fname()).compare(s2.Get_fname()) == 0) 
      && ((s1.Get_major()).compare(s2.Get_major()) == 0); 
} 


bool is_duplicate(Student s1) { 
    Student *head; 
    Student *h1 = head; 
    while (h1 != NULL) { 
     if (equalStudent(h1->p, s1)) { 
      return true; 
     } 
     h1 = h1->next; 
    } 
    return false; 
} 

void StudentList:: Add_Student() 
{ 
    int new_pid, new_ent_year; 
    string new_fname, new_dob, new_addr, new_major; 
    cout << endl << "Enter student information:" << endl; 
    cout << "Full name: "; cin.ignore(1); getline (cin,new_fname); 
    cout << "Date of birth: "; getline (cin,new_dob); 
    cout << "Address: "; getline (cin,new_addr); 
    cout << "Entrance year: "; cin >> new_ent_year; 
    cout << "Major: "; cin.ignore(1); getline (cin,new_major); 

bool duplicate = is_duplicate(new_pid, new_ent_year, new_fname, new_dob, new_addr, new_major); // call function to check for duplicate info 
if (duplicate) { 
    string proceed; 
    cout << "Duplicated! Continue? Proceed? [y/n] "; cin.ignore(1); getline (cin, proceed); 
    if (proceed != "y") { 
     return; 
    } 
} 
Student *p = new Student (new_pid, new_fname, new_dob, new_addr, new_ent_year, new_major); 
AddTail (p); 

f.seekg(0, ios::end); 
f << endl << new_pid << ":" << new_fname << ":" << new_dob << ":" << new_addr << ":" << new_ent_year << ":" << new_major; 

} 

Вот сообщение вся ошибка:

In function 'bool is_duplicate(Student)': 
[Error] 'class Student' has no member named 'p' 
In member function 'void StudentList::Add_Student()': 
[Error] no matching function for call to 'StudentList::is_duplicate(int&, int&, std::string&, std::string&, std::string&, std::string&)' 
[Note] candidate is: 
In file included from StudentList.cpp 
[Note] bool StudentList::is_duplicate(Student) 
[Note] candidate expects 1 argument, 6 provided 
+0

И вы бы показали нам класс «Студент», так как ошибка об этом? – SingerOfTheFall

+0

да, я отредактировал. – Marco

+1

Из того, что вы показали, класс 'Student' не имеет члена с именем' p'. Какая строка генерирует ошибку? – Andy

ответ

1
private: 
     Student *head, *tail; 

    public: 
     Student p; 

ваш 'р' объект типа Student в классе StudentList. Что вы говорите в своем коде - это получить объект 'p' от Student, а не StudentList.

Кроме того, я не совсем уверен, но я думаю, что вы хотите «р» быть указатель, который вы указали в вашем СРР позже

2

Я думаю, вы должны изменить ваш is_duplicate к

bool StudentList::is_duplicate(Student s1) { //this is a class member function, hence the StudentList:: 
    Student *h1 = head; //starting with the head of the list, just 1 variable is enough to iterate 
    while (h1 != NULL) { 
     //comparing current student with s1 
     if (equalStudent(*h1, s1)) { 
      return true; 
     } 
     h1 = h1->next; 
    } 
    return false; 
} 

Также обратите внимание на определения функций. В то время как ваш Add_Student определен правильно (void StudentList::Add_Student()), остальным функциям не хватает части StudentList::, что делает их просто глобальными функциями, а не функциями-членами.

+0

Я действительно настоял на этом, он сказал, что «голова не объявлена ​​в этом объеме», я думал, что я это уже объявил. – Marco

+0

@Marco, это потому, что ваш 'is_duplicate' был всего лишь глобальной функцией.Чтобы дать определение функции, которая является частью класса, она должна выглядеть как 'return_type ClassName :: functionName (<...>) {<...>}'. Вы также должны исправить другие функции. – SingerOfTheFall

0
bool is_duplicate(Student s1) { 
    Student *head; 
    Student *h1 = head; 
    while (h1 != NULL) { 
     if (equalStudent(h1->p, s1)) { 
      return true; 
     } 
     h1 = h1->next; 
    } 
    return false; 
} 

Проблема: объявляя дубликат Student *head; в рамках метода ваш Student *h1 = head; будет инициализировать h1 в неинициализированного локальной переменной, а не член класса.

Смежные вопросы