循环包括在C ++中 - 再次

时间:2013-05-06 18:07:49

标签: c++ circular-dependency

Main.cpp的

#include "Test1.h"
#include "Test2.h"

int main(){  
    Test1 t1;
    Test2 t2;

    t1.process(t2);
    t2.process(t1);

} 

Test1.h

#ifndef TEST1
#define TEST1

#include "Test2.h"

class Test1 {
public:
    void process(const Test2& t) {};
};


#endif // !TEST1

Test2.h

#ifndef TEST2
#define TEST2

#include "Test1.h"

class Test2 {
public:
    void process(const Test1& t) {};
};


#endif // !TEST2

VS2012说:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2143: syntax error : missing ',' before '&'
error C2664: 'Test2::process' : cannot convert parameter 1 from 'Test1' to 'const int'

我很确定循环包含问题(我偶尔会碰到它),但这次我不确定为什么不编译

注意:这些类只依赖于彼此的引用,这些引用具有已知的大小。是因为包含警戒(#ifndef),使其中一个测试标题包含另一个作为空文件?

5 个答案:

答案 0 :(得分:3)

如果你坚持这样做,你需要在每个.h文件中转发声明你的类,以便编译器知道它是什么。

#include "Test1.h"

class Test1;

class Test2 {
public:
    void process(const Test1& t) {};
};

答案 1 :(得分:1)

完全展开预处理器指令,您将看到问题:Main.cpp包含Test1.h,其中包含Test2.h,因此在class Test2定义之前,将首先编译Test1,导致missing type specifier错误。您可以通过向前声明Test1并说出void process(const class Test1& t)而不仅仅是void process(const Test1& t)来解决此问题。

答案 2 :(得分:0)

您需要将其中一个的前向声明放在另一个的标题中。如果你在Test2.h中转发声明Test1(在声明Test2之前),你可以从Test2.h中删除#include "Test1.h"

答案 3 :(得分:0)

如果您有一个标题中的类型的引用或指针,请尝试使用前向声明。

// Within stop Test2.h
class Test1;

答案 4 :(得分:0)

test1.htest2.h中,您可以分别使用Test2Test1的前向声明来避免包含。只需将class Test1;代替#include "test1.h"

然后仅在实现文件中包含test1.h

请参阅此question