头文件的相互包含会导致问题
Posted
技术标签:
【中文标题】头文件的相互包含会导致问题【英文标题】:Mutual inclusion of header files causes problems 【发布时间】:2017-05-07 14:53:05 【问题描述】:我有两个相互包含的头文件。 由于这会产生错误,因此我按照本网站的建议执行并删除了包含,将其中一个实例设为指针,并使用前向声明。
但是,发生了其他错误,我不知道其来源或修复。 非常感谢提前。
代码转储公司
----------------team.h-----------------
#ifndef TEAM_H
#define TEAM_H
#include <exception>
#include "avl.h"
#include "pair.h"
class Team
private:
class Mutant; //Forward Declaration
int team_ID;
Avl<int, Mutant>* team_mutants_by_ID;
Avl<Pair<int, int>, Mutant>* team_mutants_by_power;
int team_most_powerful;
public:
// C'tor
Team(int new_team_ID);
// D'tor
~Team();
// Returns the team's mutant tree that is ID sorted.
Avl<int, Mutant>* GetTeamMutantsByID();
// Returns the team's mutant tree that is sorted by power.
Avl<Pair<int, int>, Mutant>* GetTeamMutantsByPower();
; // Team
#endif
---------team.cpp-------------
#include "team.h"
const int EMPTY = -1;
// C'tor
Team::Team(int new_team_ID)
team_ID = new_team_ID;
team_mutants_by_ID = new Avl<int, Mutant>();
team_mutants_by_power = new Avl<Pair<int, int>, Mutant>();
if (!team_mutants_by_ID || !team_mutants_by_power)
delete team_mutants_by_ID;
delete team_mutants_by_power;
throw AVL_ALLOCATION_ERROR();
team_most_powerful = EMPTY;
// D'tor
Team::~Team()
delete team_mutants_by_ID;
delete team_mutants_by_power;
// Returns the team's mutant tree that is ID sorted.
Avl<int, Mutant>* Team::GetTeamMutantsByID()
return team_mutants_by_ID;
// Returns the team's mutant tree that is sorted by power.
Avl<Pair<int, int>, Mutant>* Team::GetTeamMutantsByPower()
return team_mutants_by_power;
---------mutant.h--------------
#ifndef MUTANT_H
#define MUTANT_H
#include <iostream>
class Mutant
private:
class Team; // forward declaration
int student_ID;
int grade;
int power;
Team* team;
public:
// C'tor
Mutant(int student_ID, int grade, int power);
// Default C'tor (for ghost)
Mutant();
// D'tor
~Mutant();
// Returns a pointer to the team the mutant belongs to
// If the mutants does not belong to a team - returns NULL
Team* GetTeam();
; // Mutant
#endif
---------mutant.cpp----------
#include "mutant.h"
const int EMPTY = -1;
// C'tor
Mutant::Mutant(int student_ID, int grade, int power) :
student_ID(student_ID), grade(grade), power(power), team(NULL)
// Default C'tor (for ghost)
Mutant::Mutant() : student_ID(EMPTY), grade(EMPTY), power(EMPTY), team(NULL)
;
// D'tor - Default is enough
Mutant::~Mutant()
// Returns a pointer to the team the mutant belongs to
// If the mutants does not belong to a team - returns NULL
Team* Mutant::GetTeam()
return team;
错误是: 标识符“团队”未定义 (mutant.cpp)
声明与“Mutant::Team *Mutant::GetTeam()”不兼容 (mutant.cpp)
int *Mutant::GetTeam(void):overloaded 函数与 Mutant::Team *Mutant::GetTeam(void) (mutant.cpp) 的返回类型不同
team.cpp中也有类似的错误
如果需要,我可以提供其他信息。 谢谢提前。
【问题讨论】:
您需要在实现中包含这两个标头。当您实际使用它们时,编译器需要知道它们是什么。前向声明对此无济于事。 这正是我最初所做的,尽管它也产生了错误。另外,这个网站上类似问题的答案说只使用前向声明。我应该尝试只使用包含而不使用前向声明吗? 您需要在 headers 中进行前向声明,但 implementation 需要包含您使用的所有类的所有标题。现在你只包括一个而不包括另一个。 您是否尝试过将前向引用放在类之外? 这实际上解决了它,迈克。非常非常感谢 【参考方案1】:当编译器尝试编译 Team* Mutant::GetTeam()
时,它会将 Team
视为属于全局范围。但是,Team
不属于全局作用域,因为就编译器在编译Mutant.cpp
时可以判断的情况而言,它被定义的唯一位置是在Mutant
内,作为前向引用。所以,Mutant::Team* Mutant::GetTeam()
可能会起作用,尽管它可能会在以后引起问题,因为Team
并不是Mutant
中的真正嵌套类。将Team
的前向引用放在Mutant
类的外部 可能会起作用。
但是,最好从mutant.h
中删除#include "team.h"
,并在Mutant
中删除Team
的前向声明。
如果这给您带来错误,那将是另一个 *** 问题的主题。
【讨论】:
以上是关于头文件的相互包含会导致问题的主要内容,如果未能解决你的问题,请参考以下文章