这是问题文件的相对简单的升级:
/* 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的指针向量,所以我不打算重新构建以避免这种情况。我猜我只是对头文件做错了。
提前感谢任何想法,这个让我疯狂。
答案 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组合到一个文件中。它们紧密相连,因此它们属于一体。