1

我正面臨使用前向聲明的問題,我不知道如何解決它。這裏是我的文件:使用前向聲明編譯時間「null」?

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找到每個元素編寫代碼(我沒有問題),它發生只有當我編譯(構建)。

爲什麼?我通過BubblePlug,我做了IPianoRollIMidiEngine的轉發,包括他們的訂單(在BubblePlug.cpp)。

IMidiEngine應該知道關於IPianoRoll(它首先包括在內)的一切。

至少,我應該在「運行時」有問題,爲什麼在編譯?

你能幫我理解問題以及如何解決它嗎?謝謝。

+0

嘗試添加'#include「IMidiEngine.h」'到IPianoRoll.h – alexeykuzmin0

+0

@ alexeykuzmin0:我編輯了這個問題。一探究竟! – markzzz

+1

無關:你的包括警衛是非法的。 https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier –

回答

1

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(); 
} 
+0

現在我看到了什麼問題。由於它添加了「once」,IPianoRoll總是在IMidiEngine之後。所以IMidiEngine不知道IPianoRoll的啓動方法,對嗎?爲什麼說spearate文件將解決這個問題?這就是我不想要的。在編譯時首先包含.h,而不是「compile」.cpp? – markzzz

+1

在允許使用它之前,您必須確保已經看到類的定義。我建議的解決方案是這樣做的:它將函數體移到編譯後面的點,編譯器已經看到兩個定義。 –

+1

@paizza - 在.cpp文件中*首先包含所有內容 - 在函數體中可見。在頭文件中,您無法看到下一個標題中出現的內容。 –