田野'班级'有一个不相容的课程'

时间:2015-03-24 02:32:10

标签: c++ function class compiler-errors incompatibility

我收到这些错误:

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; }

当我从student.h中删除include node.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

在node.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

我尝试了其他一些方法来尝试修复错误,但没有得出任何结论,非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

问题是student.h包含了node.h,它需要Student的完整定义,因此它包含student.h,但是由于我们已经在处理student.h,所以已经定义了标题保护,没有任何内容,所以它继续在node.h中并获取一个Student变量,但它尚未定义,因为即使我们从student.h开始,我们也从未真正进入Student类。

解决方案是从student.h中删除node.h的include

答案 1 :(得分:1)

我对这两行感到非常困惑:

#include "student.h"
class Student;

我不相信第二个是必要的。

这是做什么的是说“嘿编译器,从这里的头文件中获取类Student的定义,以便我可以在这个类中使用它,你将了解它的成员和方法,我们都将是快乐“紧随其后”嘿编译器,忘记我刚刚给你的完整的类定义,相反,我宣布学生类存在,但我只是稍后会告诉你更多关于它的事情。编译器正确混淆。

答案 2 :(得分:1)

对于你的第二个(第一个?)错误,你有两个标题包括彼此。而且我不明白为什么,因为在学生中唯一引用Node的是它的朋友,而且Node从Student中使用的唯一东西是get&amp; setStudent(),它们是公共方法。我尝试删除friend class Node#include "node.h",看看是否有所作为。