基础 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。
我遇到了一些问题,函数没有返回正确的类型,因为 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。