C++ 编译时“;空";使用远期申报?
我在使用转发声明时遇到了一个问题,我不知道如何解决它。这是我的档案: 气泡塞.hC++ 编译时“;空";使用远期申报?,c++,pointers,compilation,compiler-errors,forward-declaration,C++,Pointers,Compilation,Compiler Errors,Forward Declaration,我在使用转发声明时遇到了一个问题,我不知道如何解决它。这是我的档案: 气泡塞.h #ifndef _BUBBLEPLUG_ #define _BUBBLEPLUG_ #include "IPlug_include_in_plug_hdr.h" #include "resource.h" #include "IControl.h" class IPianoRoll; class IMidiEngine; class BubblePlug: public IPlug { private: p
#ifndef _BUBBLEPLUG_
#define _BUBBLEPLUG_
#include "IPlug_include_in_plug_hdr.h"
#include "resource.h"
#include "IControl.h"
class IPianoRoll;
class IMidiEngine;
class BubblePlug: public IPlug
{
private:
public:
IMidiEngine *pMidiEngine;
IPianoRoll *pPianoRoll;
BubblePlug(IPlugInstanceInfo instanceInfo);
~BubblePlug();
};
#endif // !_BUBBLEPLUG_
#ifndef _IMIDIENGINE_
#define _IMIDIENGINE_
class IMidiEngine
{
private:
BubblePlug *pBubblePlug;
public:
IMidiEngine(BubblePlug *bubbleplug) : pBubblePlug(bubbleplug) {
}
~IMidiEngine() {
};
void Init(bool randomScore = true) {
pSamplwhk->pPianoRoll->Start();
}
};
#endif // !_IMIDIENGINE_
BubblePlug.cpp
#include "BubblePlug.h"
#include "IPlug_include_in_plug_src.h"
#include "IPianoRoll.h"
#include "IMidiEngine.h"
BubblePlug::BubblePlug(IPlugInstanceInfo instanceInfo) : IPLUG_CTOR(10, 1, instanceInfo) {
pPianoRoll = new IPianoRoll(this, 8, 8);
pMidiEngine = new IMidiEngine(this);
}
BubblePlug::~BubblePlug() {
delete pPianoRoll;
delete pMidiEngine;
}
ipianroll.h
#ifndef _IPIANOROLL_
#define _IPIANOROLL_
#include "IMidiEngine.h"
class IPianoRoll : public IControl
{
private:
BubblePlug *pBubblePlug;
public:
IPianoRoll(BubblePlug *bubbleplug, int x, int y) : IControl(bubbleplug, IRECT(x, y, x + 10, y + 10)), pBubblePlug(bubbleplug) {
}
~IPianoRoll() {
};
bool Draw(IGraphics *pGraphics) {
return true;
}
void Random(bool onlyScore = false) {
pBubblePlug->pMidiEngine->Init();
}
void Start() {
}
};
#endif // !_IPIANOROLL_
IMidiEngine.h
#ifndef _BUBBLEPLUG_
#define _BUBBLEPLUG_
#include "IPlug_include_in_plug_hdr.h"
#include "resource.h"
#include "IControl.h"
class IPianoRoll;
class IMidiEngine;
class BubblePlug: public IPlug
{
private:
public:
IMidiEngine *pMidiEngine;
IPianoRoll *pPianoRoll;
BubblePlug(IPlugInstanceInfo instanceInfo);
~BubblePlug();
};
#endif // !_BUBBLEPLUG_
#ifndef _IMIDIENGINE_
#define _IMIDIENGINE_
class IMidiEngine
{
private:
BubblePlug *pBubblePlug;
public:
IMidiEngine(BubblePlug *bubbleplug) : pBubblePlug(bubbleplug) {
}
~IMidiEngine() {
};
void Init(bool randomScore = true) {
pSamplwhk->pPianoRoll->Start();
}
};
#endif // !_IMIDIENGINE_
当我编译时,它会显示大约pSamplwhk->pPianoRoll->Start()代码>:
VS2015找到编写代码的每个元素(我没有问题),只有在编译(构建)时才会发生
为什么??我通过了BubblePlug
,并转发了ipianroll
和IMidiEngine
,按顺序包括它们(在BubblePlug.cpp
)
IMidiEngine
应该知道关于ipianroll
的所有事情(首先包括它)
至少,我应该在“运行时”有问题,为什么是在编译时
你能帮我理解这个问题以及如何解决它吗?谢谢。ipianroll.h包含IMidiEngine.h,因此无论您以何种顺序包含这两个文件,ipianroll的定义都将始终位于使用它的init
函数之后
避免这种情况的一种方法是将init
函数体移动到单独的.cpp文件中:
在IMidiEngine.h中:
void Init(bool randomScore=true);
在IMidiEngine.cpp中:
void IMidiEngine::Init(bool randomScore) {
pSamplwhk->pPianoRoll->Start();
}
尝试将#包括“IMidiEngine.h”
添加到ipianroll。h@alexeykuzmin0当前位置我已经编辑了这个问题。过来看!无关:你的包括警卫是非法的。现在我明白问题所在了。由于它加上了“一次”,伊帕诺尔就变成了总是在亚胺丁烷之后。所以IMidiEngine不知道IPianoRoll的启动方法,对吗?为什么Sperate文件可以解决这个问题?这就是我不明白的。在编译时,如果include.h大于“compile.cpp”,则必须确保在允许使用类之前看到类的定义。我建议的解决方案是这样的:它将函数体移动到编译中的稍后点,编译器已经看到了这两个定义。@paizza-在.cpp文件中,所有内容都是首先包含的-因此在函数体中可见。在头文件中,您无法看到下一个头文件中的内容。现在开始理解为什么会有.cpp和.h文件:)