C ++头文件相互引用的神秘编译器错误

时间:2012-12-06 01:26:54

标签: c++ visual-c++

好的,这让我很难过。相对C ++ noob,但有C#和其他语言的长期经验。

这是问题文件的相对简单的升级:

/* GameObject.h */
#pragma once
#include <vector>
class GameObject {
    public:
    std::vector<Component *> *Components;
    GameObject();
    ~GameObject();
};


/* GameObject.cpp */
#include "GameObject.h"
#include "Component.h"
GameObject::GameObject() {
}

GameObject::~GameObject() {
}


/* Component.h */
#pragma once
class Component {
    public:
    GameObject *Owner;
    Component();
    ~Component();
};


/* Component.cpp */
#include "GameObject.h"
#include "Component.h"
Component::Component() {
}
Component::~Component() {
}

这在Visual C ++ 2012中生成了21个完全不相关的错误,我想这是因为它无法编译组件:

C2065: 'Component' : undeclared identifier  gameobject.h    10
C2059: syntax error : '>'   gameobject.h    10
C2143: syntax error : missing ';' before '}'    gameobject.h    14
C2143: syntax error : missing ';' before '{'    component.h 3
C2143: syntax error : missing ';' before '}'    component.h 11
C2143: syntax error : missing ';' before '{'    gameobject.cpp  8
C2143: syntax error : missing ';' before '}'    gameobject.cpp  9
C2143: syntax error : missing ';' before '{'    gameobject.cpp  13
C2143: syntax error : missing ';' before '}'    gameobject.cpp  14
C2143: syntax error : missing ';' before '}'    gameobject.cpp  16
C1004: unexpected end-of-file found gameobject.cpp  16
C2065: 'Component' : undeclared identifier  gameobject.h    10
C2059: syntax error : '>'   gameobject.h    10
C2143: syntax error : missing ';' before '}'    gameobject.h    14
C2143: syntax error : missing ';' before '{'    component.h 3
C2143: syntax error : missing ';' before '}'    component.h 11
C2653: 'Component' : is not a class or namespace name   component.cpp   8
C2143: syntax error : missing ';' before '{'    component.cpp   8
C2143: syntax error : missing ';' before '}'    component.cpp   9
C2653: 'Component' : is not a class or namespace name   component.cpp   13
C1903: unable to recover from previous error(s); stopping compilation   component.cpp   13

有什么想法吗?在Component的设计中有一个指向GameObject的指针是有意义的,GameObject有一个指向Components的指针向量,所以我不打算重新构建以避免这种情况。我猜我只是对头文件做错了。

提前感谢任何想法,这个让我疯狂。

2 个答案:

答案 0 :(得分:2)

你需要解决的是添加前向声明 - GameObject定义之前的Component,反之亦然

class GameObject;
class Component {
...

class Component;
class GameObject{
...

从技术上讲,由于您订购.h文件的方式,您只需要第二个。但是你最好加两个。

原因是因为如果我们将您的.h视为独立的C ++文件,那么当我们(编译器)遇到{{1}向量的定义时指针(为什么这是一个指向矢量的指针??),我们仍然不知道Component是什么。它可能是一个类,一个函数,一个错字,任何东西。这就是为什么你需要一个前向声明让编译器知道它是一个类。

这仅适用于指向其他类的指针/引用。如果它是Component个对象的向量,你将别无选择,只能在定义之前包含标题。

答案 1 :(得分:1)

在#pragma之后将组件的前向声明放在顶部,就像这样......

class Component; // Just this, no more.

可能仍有错误,但这是一个开始。

我建议您将GameObject.h和Component.h组合到一个文件中。它们紧密相连,因此它们属于一体。