2015-03-24 2 views
0

я получаю эти ошибки:поле «класс» имеет несовместимый «класс»

node.h:12:2: error: 'Student' does not name a typeStudent student; 
node.h:17:14: error: 'Student' does not name a typeNode(const Student&); 
node.h:20:25: error: 'Student' does not name a type 
void setStudent(const Student&); 
node.h:21:2: error: 'Student' does not name a type 
Student getStudent() const { return student; } 

это то, что происходит, когда я удалить включить node.h из student.h

node.cpp:13: first defined here 
node.cpp.o: In function `Node::~Node()' 
node.cpp:13: multiple definition of `Node::Node()' 
node.cpp:13: first defined here 
node.cpp.o: In function `Node::~Node()': 
node.cpp:17: multiple definition of `Node::Node(Node const&)' 
main.cpp.o:node.cpp:17: first defined here 
node.cpp.o: In function `Node::~Node()': 
node.cpp:17: multiple definition of `Node::Node(Node const&)' 
main.cpp.o:C:node.cpp:17: first defined here 
node.cpp.o: In function `Node::Node(Student const&)': 
node.cpp:25: multiple definition of `Node::Node(Student const&)' 
node.cpp:25: first defined here 

в узле .h

#pragma once 
#ifndef node_h 
#define node_h 
#include "student.h" 
class Node 
{ 
private: 
    Student student; 
    Node* nextPtr; 
    Node* prevPtr; 
public: 
    Node(); 
    Node(const Student&); 
    Node(const Node&); 
    virtual ~Node() {} 
    void setStudent(const Student&); 
    Student getStudent() const { return student; } //second error here 
    //linked list needs to be set as a friend 
    friend class dblinkedlist; 
}; 
#endif 

в student.h я не понимаю, почему это не работает должным образом, я попытался изменения кода много раз, но безрезультатно.

#ifndef STUDENT_H 
    #define STUDENT_H 
    #include <stdio.h> 
    #include <string> 
    #include "node.h" 
    using namespace std; 
class Student 
{ 
private: 
    string FirstName; 
    string LastName; 
    int idNumber; 
    double Gpa; 
public: 
    //constructors 
    Student(); 
    Student(string, string, int, double); 
    //copy construtor 
    Student(const Student&); 
    //destructor 
    virtual ~Student(){} 
    //set/get for private data 
    void setidNumber(int i); 
    int getidNumber() const { return idNumber; } 
    void setFirstName(string); 
    string getFirstName(string) const { return FirstName; } 
    void setLastName(string); 
    string getLastName(string) const { return LastName; } 
    void setGpa(double g); 
    double getGpa(double) const { return Gpa; } 
    void setStudent(const Student&); 
    Student getStudent() const { return *this; } 
    //overloaded assignment 
    Student operator=(const Student&); 
    //overloaded <<and>> 
    friend ostream& operator<<(ostream&, const Student&); 
    friend istream& operator>>(istream&, Student&); 
    //overloaded == 
    friend bool operator==(const Student&, const Student&); 
    //make Node class a friend 
    friend class Node; 
    }; 
#endif 

Я пробовал некоторые другие методы, пытаясь исправить ошибку, но пришли к выводу, нет, любая помощь очень ценится.

+0

Если вы вперед объявить класс, он может быть использован только в качестве указателя или ссылки. «Студенческий студент» не является ни одним из них, поэтому требуется полное определение «Студент». Я бы предположил, что это в student.h, но вы не включили этот файл. –

+0

Возможный дубликат ошибки [«Поле имеет неполный тип»] (http://stackoverflow.com/questions/12466055/field-has-incomplete-type-error) –

+1

Удалите '#include" node.h "из Student. ч, что должно прояснить ситуацию. Вы можете поместить его в Student.cpp (после включения Student.h), если это необходимо. –

ответ

1

Для вашей второй (первой?) Ошибки у вас есть оба заголовка, включая друг друга. И я не понимаю, почему, поскольку единственная ссылка на Node in Student - это ее дружба, и единственное, что использует Node от Student, это получить & setStudent(), которые являются общедоступными методами. Я попытался бы удалить friend class Node и #include "node.h", чтобы узнать, не изменилось ли это.

+0

Я попытался удалить оба, и это просто дает мне ошибки «multiple definiton» – CodeHero

+0

@CodeHero: опубликуйте обновленный код и новые ошибки. Мы это получим. –

+0

@CodeHero: Кроме того, я замечаю, что вы упустили '# endif' в node.h внизу. –

1

Я глубоко смущен этими двумя линиями:

#include "student.h" 
class Student; 

Я не считаю, что второй необходимо.

Что это значит: «Эй, компилятор, перейдите к определению класса Student из этого заголовочного файла здесь, чтобы я мог использовать его в этом классе, и вы узнаете о его членах и методах, и мы оба будьте счастливы ", сразу после этого" hey compiler, забудьте об этом полном определении класса, которое я вам только что дал, вместо этого я объявляю, что класс Student существует, но я только расскажу вам об этом позже ". Компилятор правильно запутался.

+0

Это не объясняет сообщение об ошибке. –

+0

Im редактирование, сек. –

+0

Это дает мне сообщение о том, что Student не называет тип, если я это сделаю – CodeHero

2

Проблема заключается в том, что student.h включает node.h, которому требуется полное определение Student, поэтому он включает student.h, но поскольку мы уже обрабатываем student.h, защитники заголовков определены и ничего не существует , поэтому он продолжается в node.h и переходит к переменной Student, но пока не определен, потому что, хотя мы начали с student.h, мы никогда не попадали в класс Student.

Раствор для удаления включают node.h из student.h

+0

Я сделал это, но у меня много ошибок. Опубликовано выше. – CodeHero

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