2

好吧,这难倒我。相对 C++ 菜鸟,但长期使用 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 的指针向量是有意义的,所以我不打算重新架构以避免这种情况。我猜我只是对头文件做错了。

提前感谢您的任何想法,这让我发疯了。

4

2 回答 2

2

您需要解决的只是添加前向声明 - 在 GameObject 定义之前添加组件,反之亦然

class GameObject;
class Component {
...

class Component;
class GameObject{
...

从技术上讲,您只需要第二个,因为您订购 .h 文件的方式。但最好同时添加两者。

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

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

于 2012-12-06T01:43:48.607 回答
1

在 #pragma once 之后,在顶部放置一个前向声明 Component,就像这样......

class Component; // Just this, no more.

可能仍然存在错误,但这是一个开始。

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

于 2012-12-06T01:39:24.570 回答