编译时间 "null" 使用前向声明?
Compile time "null" using forward declaration?
我在使用前向声明时遇到问题,我不知道如何解决。这是我的文件:
BubblePlug.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_
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;
}
IPianoRoll.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 _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();
:
use of undefined type 'IPianoRoll'
left of '->Start' must point to class/struct/union/generic type
VS2015 找到每个编写代码的元素(我没问题),它只在我编译(Build)时发生。
为什么?我通过了 BubblePlug
并向前推进了 IPianoRoll
和 IMidiEngine
,按顺序包括它们(在 BubblePlug.cpp
上)。
IMidiEngine
应该知道关于 IPianoRoll
的一切(首先包括在内)。
至少,我应该在 "runtime" 有问题,为什么在编译时?
你能帮我理解这个问题以及如何解决它吗?谢谢。
IPianoRoll.h 包含 IMidiEngine.h,因此无论您以何种顺序包含这两个文件,IPianoRoll 的定义总是在使用它的 init
函数之后。
避免这种情况的一种方法是将 init
函数的主体移动到单独的 .cpp 文件中:
在IMidiEngine.h中:
void Init(bool randomScore=true);
在IMidiEngine.cpp中:
void IMidiEngine::Init(bool randomScore) {
pSamplwhk->pPianoRoll->Start();
}
我在使用前向声明时遇到问题,我不知道如何解决。这是我的文件:
BubblePlug.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_
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;
}
IPianoRoll.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 _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();
:
use of undefined type 'IPianoRoll'
left of '->Start' must point to class/struct/union/generic type
VS2015 找到每个编写代码的元素(我没问题),它只在我编译(Build)时发生。
为什么?我通过了 BubblePlug
并向前推进了 IPianoRoll
和 IMidiEngine
,按顺序包括它们(在 BubblePlug.cpp
上)。
IMidiEngine
应该知道关于 IPianoRoll
的一切(首先包括在内)。
至少,我应该在 "runtime" 有问题,为什么在编译时?
你能帮我理解这个问题以及如何解决它吗?谢谢。
IPianoRoll.h 包含 IMidiEngine.h,因此无论您以何种顺序包含这两个文件,IPianoRoll 的定义总是在使用它的 init
函数之后。
避免这种情况的一种方法是将 init
函数的主体移动到单独的 .cpp 文件中:
在IMidiEngine.h中:
void Init(bool randomScore=true);
在IMidiEngine.cpp中:
void IMidiEngine::Init(bool randomScore) {
pSamplwhk->pPianoRoll->Start();
}