基础 class 未定义,但包含其 header

Base class undefined, but its header is included

我遇到了一些问题,函数没有返回正确的类型,因为 class 没有定义。我正在使用工厂模式。

我收到的两条错误消息是:

'return': cannot convert from 'DLA *' to 'Layer *'

和:

'Layer': base class undefined (compiling source file src\Layer.cpp)

并且对于包含 Layer.h.

的每个文件都会重复此相同的错误消息

这是我的 class 继承自 Layer 的样子 (DLA.h):

#pragma once

#ifndef _DLA
#define _DLA

#include "ofMain.h" 
#include "ofxGui.h"
#include "Layer.h"

class DLA: public Layer
{
public:
    DLA();
    void setup();
    void update();
    void draw();

private:
};

#endif

这是我的 Layer class header (Layer.h):

#pragma once

#ifndef _LAYER
#define _LAYER

#include "ofMain.h" 
#include "ofxGui.h"
#include "DLA.h"

enum SceneType
{
    Scene_None,
    Scene_Default,
    Scene_DLA,
};

class Layer
{

public:

    void setup();
    void update();
    void draw();
    static Layer *CreateSimulation(SceneType Type);


private:
};

#endif

失败的功能是这个,位于 Layer.cpp:

Layer *Layer::CreateSimulation(SceneType Type)
{
    switch (Type)
    {
    case Scene_None:
    default:
        return nullptr;
    case Scene_DLA:
        return new DLA();
    }
}

我已经尝试了所有我能在 Stack Overflow 上找到的与我有类似问题的东西,但我看到有些人建议使用非常微妙的代码缩进来解决这个问题,所以我真的找不到问题所在是。

就目前而言,您的 header 文件会导致 循环依赖性 ,即使 #pragma once(和其他)守卫阻止了任何实际的 'infinite recursion'.当编译 Layer.cpp 文件(或任何其他包含 #include "Layer.h" 的“.cpp”源文件)时,让我们看一下来自编译器 point-of-view 的代码序列。

编译器遇到 #include "Layer.h"(第一次遇到 - 守卫不会 'triggered'),所以它适时地用指示的内容替换该行 header.在该内容中,它遇到 #include "DLA.h"(我们可以忽略此讨论中包含的其他 header,假设它们与手头的问题无关)。因此,它会用 DLA.h header 的内容适当地替换 that 行,此时它会遇到这个:

#include "Layer.h"

class DLA: public Layer
{

现在,在这里,当它用 header 内容替换 #include "Layer.h" 时,该内容将是 'empty'(因为守卫,因为它已经包含了 header 一次)。因此,当遇到 public Layer 代码时,它是一个错误,因为 class 尚未 尚未定义 ,甚至声明为 class.

所以,如果您真的坚持Layer.h中加入#include "DLA.h"行,那么必须放在 定义 Layer class.

之后

但是,更好的方法是从 Layer.h 中删除 #include "DLA.h",并且只将它放在 source (.cpp) 文件中需要它(比如 Layer.cpp)。这会很好用:

// Layer.cpp
#include "Layer.h"
#include "DLA.h"   // At this point, references to the Layer class in DLA.h will be fine!

//...

Layer *Layer::CreateSimulation(SceneType Type)
{
    switch (Type)
    {
    case Scene_None:
    default:
        return nullptr;
    case Scene_DLA:
        return new DLA();
    }
}

如有任何进一步的说明,请随时询问 and/or。