2012-01-25 61 views
1

我想知道为什么代码下面不工作。 在b.cpp中,类B使用类A,但由于未找到类A的声明而失败。 但是,之前包含a.hpp。为什么#include“a.hpp”在这里不起作用?标题包括和循环依赖

感谢您的帮助!

//=============================================== 
//file: a.hpp 
//=============================================== 
#ifndef _A_HPP 
#define _A_HPP 

#include "b.hpp" 

class A{ 
    public: 
     A(); 
     // others methods using B here 
}; 

#endif 


//=============================================== 
//file: a.cpp 
//=============================================== 
#include "a.hpp" 

A::A(){} 


//=============================================== 
//file: b.hpp 
//=============================================== 
#ifndef _B_HPP 
#define _B_HPP 

#include "a.hpp" 

class B{ 
    public: 
     B(A a); 
}; 

#endif 
//=============================================== 
//file: b.cpp 
//=============================================== 
#include "b.hpp" 

B::B(A a){} 



SHELL$ g++ -c a.cpp 
In file included from a.hpp:7, 
       from a.cpp:4: 
b.hpp:11: error: expected ‘)’ before ‘a’ 

回答

2

您需要使用Forward declarations打破这种循环依赖。
但是,请注意,一旦你向前声明一个类型,该类型成为不完全类型编译器和有关于如何使用不完整的类型

0

从取出

#include "b.hpp" 

限制a.h和只有一个向前声明 - 假设你在A使用指针B

//A.hpp 

class B; //forward declaration 

class A{ 
    public: 
     A(); 
     // others methods using B here 
}; 

另请参见:以下划线_开头的宏名称由标准保留,不应使用。用B_HPP代替_B_HPP

+0

感谢的好评约_ – user744629

0

为什么你需要这样的循环#include?如果你只需要编译器知道一个类存在(因此它可以是一个参数等等),只是向前声明它是这样的:

class A; 

不要循环包含文件。即使有警卫,他们也只会被包括一次,当然,但是在编译器达到其定义之前,或者在编译器达到其定义之前提及B之前,您仍然会碰到A的提及。

+0

我在想一个#include是更好的,不重复的代码,使维护支持方便。但好的,重复的代码只是“A类”;并且它不应该在一个真正的长源代码中长得多...... – user744629

0

当b.hpp包括a.hpp,_A_HPP已经被定义,所以预编译器忽略文件的内容,所以在线路B(A a),编译器不会,如果你真的了解A.

需要这些包括,请尝试将#include "b.hpp"移至a.hpp的末尾(或者在b.hpp的头部声明class A;)。

+0

我在想一切都在一个大文件中,最后包含:a.cpp + a.hpp + b.hpp – user744629

+0

更像b.hpp + a .HPP + a.cpp – asaelr

0

在A.hpp中,不要包含调用B方法的B.hpp或inline A实现。

如果您需要参考B&B*,请在A.hpp(前向声明)中使用class B;

取而代之,将那些A实现调用B.cpp中的B方法,并将A.hpp包含在A.cpp中。

1

这是行不通的。在你的头文件中,你应该只包含引用或指向其他类的指针。然后,你可以转发声明A或B,例如:

//=============================================== 
//file: b.hpp 
//=============================================== 
#ifndef _B_HPP 
#define _B_HPP 

class A; 

class B{ 
    public: 
     B(A& a); 
}; 

#endif