头文件的相互包含会导致问题

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 的前向声明。

如果这给您带来错误,那将是另一个 *** 问题的主题。

【讨论】:

以上是关于头文件的相互包含会导致问题的主要内容,如果未能解决你的问题,请参考以下文章

我需要相互包含两个头文件,而不是使用前向声明导致“不完整类型”错误

c++头文件相互包含

C++两个头文件相互包含

qt c++对象头文件如何相互包含

头文件包漏洞

C++中头文件设计