编译时间 "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 并向前推进了 IPianoRollIMidiEngine,按顺序包括它们(在 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();
}